Для 1-й ошибки ваша вторая ветвь не возвращает bool
, вы должны написать:
| x::xs when col = card_color x -> match_col xs col
Для 2-й ошибки, обратите внимание, что not
на самом деле является функцией, поэтому она ожидаетbool
значение, а не Color
значение, вы должны написать:
| x::xs when not (col = card_color x) -> false
Компилятор по-прежнему не может убедиться, что ваше сопоставление завершено, поскольку он не может знать, что функция card_color
является чистой или нечистой.Он предупредит вас warning FS0025: Incomplete pattern matches on this expression.
Итак, вы должны написать:
let rec match_col cs col =
match cs with
| [] -> true
| x::xs when col = card_color x -> match_col xs col
| _ -> false
Но, просматривая список и проверяя, удовлетворен ли элемент, условие уже поддерживается модулем List
.Итак, вы можете написать:
let match_col cs col =
cs |> List.exists (fun x -> card_color x <> col) |> not
Наконец, чтобы получить доступ к элементу списка, вы должны использовать запись dot
: cs.[0]
, а не cs[0]
.Но при использовании нотации dot
вы должны предоставить аннотацию типа, поэтому мы должны написать:
let all_same_color (cs : Card list) =
let col = card_color cs.[0]
let res = match_col cs col
res
Другой способ записи без dot notation
:
let all_same_color cs =
let col = card_color (cs |> List.head)
let res = match_col cs col
res