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)
или похожие