F#类型推理

cod*_*lyf 8 f# type-inference

我正在使用fsharp类型推理,我正在尝试理解它们是如何工作的.为什么会这样

List.filter List.head
Run Code Online (Sandbox Code Playgroud)

是类型bool list list -> bool list list

Car*_*ten 10

List.filter有类型(只需输入List.filter;;FSI):

> List.filter;;
val it : (('a -> bool) -> 'a list -> 'a list)
Run Code Online (Sandbox Code Playgroud)

所以它需要一个'a -> bool并导致一个'a list -> 'a list

现在你用它喂它

> List.head;;
val it : ('b list -> 'b)
Run Code Online (Sandbox Code Playgroud)

(这是另一个'a真的所以我重命名了)现在你有:

'a -> bool ~ 'b list -> 'b
Run Code Online (Sandbox Code Playgroud)

你可以统一这个并看到:

  • '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
Run Code Online (Sandbox Code Playgroud)