我正在使用fsharp类型推理,我正在尝试了解它们的工作原理。为什么呢
List.filter List.head
是bool list list -> bool list list
的类型?
答案 0 :(得分:10)
List.filter
具有类型(只需在FSI中输入List.filter;;
):
> List.filter;;
val it : (('a -> bool) -> 'a list -> 'a list)
所以它需要'a -> bool
并产生'a list -> 'a list
现在你用
喂它> List.head;;
val it : ('b list -> 'b)
(这是另一个'a
,所以我重新命名了它,现在你有了:
'a -> bool ~ 'b list -> 'b
你可以统一这一点并看到:
'b ~ bool
(来自->
的右侧)'a ~ 'b list ~ bool list
(从左侧开始)但是这一切都得到了答案F#的类型推理给你:
'a list -> 'a list
~ ('b list) list -> ('b list) list
~ (bool list) list -> (bool list) list
~ bool list list -> bool list list