Тип ('a -> bool) list
происходит от типа filter
и от сочетания с шаблоном h::t
в комбинации. Вы просите использовать один элемент списка h
в качестве предиката , который будет применяться к каждому элементу списка t
. Система типов ML не может выразить эту ситуацию. filter
ожидает два аргумента, один из которых имеет тип 'a -> bool
, где 'a
неизвестен, и второй аргумент типа 'a list
, где 'a
- это такой же неизвестный тип, как в первом аргумент. Поэтому h
должен иметь тип 'a -> bool
, а t
должен иметь тип 'a list
.
Но вы также написали h::t
, что означает, что существует другой неизвестный тип 'b
такой, что h
имеет тип 'b
, а t
имеет тип 'b list
. Сложите это вместе, и вы получите этот набор уравнений:
'a -> bool == 'b
'a list == 'b list
Средство проверки типов смотрит на это и решает, может быть, 'a == 'b
, что приводит к более простой проблеме
'a -> bool == 'a
и он не может найти никакого решения, поэтому он блеет.
Ни простая форма, ни исходное уравнение не имеют решения.
Вы, вероятно, ищете List.filter (fun x -> x = h) t
, и вам, вероятно, было бы еще лучше использовать List.exists
.