F# 类型推断

F# type inferencing

我正在使用 fsharp 类型推断,我正在尝试了解它们的工作原理。为什么会这样

List.filter List.head

类型是 bool list list -> bool list list?

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