F# Частичное совпадение с образцом "Правило никогда не будет совпадать"

Учитывая следующий активный образец:

let (| HasMatch |) (x:string) = 
  if x.Contains("0") then Some()
  else None;;

И следующий шаблон соответствия функции:

let testFn x = function
  | HasMatch i -> printfn "%A" i
  | _ -> printf "nope";;

Шаблон подстановки последней строки говорит warning FS0026: This rule will never be matched

Все примеры, которые я вижу, показывают, что частично активные шаблоны должны возвращаться Some('a) чтобы соответствовать, и те, которые возвращаются None быть захваченным подстановочным знаком. Ошибка, кажется, говорит по-другому.

Что мне не хватает?

1 ответ

Решение

Я думаю, что вы должны добавить None регистр для активного объявления шаблона следующим образом:

let (| HasMatch | _ |) (x:string) = 
  if x.Contains("0") then Some()
  else None;;

В вашем оригинальном примере компилятор делает вывод, что вы действительно хотите вернуть Option тип. Когда вы запускаете printf в вашем примере вы увидите, что это печатать Some Null когда есть совпадение.

Кроме того, это плохо, чтобы вернуться Some()Возвращайся скажи Some(x) или похожие

Другие вопросы по тегам