У меня есть код, который работает отлично:Несоответствия типа с шаблоном
let rec calculate s l acc =
if length s = 0 then
acc
else
if first s = l then
calculate (rest s) l (acc+1)
else
calculate (rest s) (first s) acc
Я хочу переписать его с помощью сопоставления с образцом:
let rec calculate s l acc =
function
| _, _, _ when length s = 0 -> acc
| _, _, _ when first s = l -> calculate (rest s) l (acc+1)
| _, _, _ -> calculate (rest s) (first s) acc
Но последняя функция возвращает сообщение об ошибке:
| _, _, _ when first s = l -> calculate (rest s) l (acc+1) -----------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/Пользователи/demas/tempor/stdin (512,36): ошибка FS0001: Несоответствие типов. Ожидающий 'a, но заданный ' b * 'c *' d -> 'a Получаемый тип будет бесконечным при объединении' 'a' и '' b * 'c *' d -> 'a'
Почему?
Это случай, когда сопоставление образцов на самом деле ничего не приносит. Я бы просто использовал ваш исходный код с 'elif' вместо' else if', чтобы избежать слишком глубокого отступа, но все. – Tarmil