2015-09-29 23 views
7

私はfsharp型推論で作業していますが、どのように動作するのか理解しようとしています。それはなぜですかF#型推論

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) 

ので、それが今、あなたは

> List.head;; 
val it : ('b list -> 'b) 

(とそれを養う'a list -> 'a list

'a -> boolと結果を取ります別の'aだから私はそれを改名しました)そして今あなたは持っています:

'a -> bool ~ 'b list -> 'b 

あなたはこれを統一して見ることができます:

  • 'a ~ 'b list ~ bool list(左手側から)
  • ->の右手の側から)

    • 'b ~ boolしかし、これがすべて一緒になって答えが得られます。F#の型推論はあなたに与えます:

      'a list -> 'a list 
      ~ ('b list) list -> ('b list) list 
      ~ (bool list) list -> (bool list) list 
      ~ bool list list -> bool list list 
      
    +0

    申し訳ありません私はまだ理解していない、何を意味するのですか? – coder4lyf

    +0

    問題はありません(それを言及しておくべきです) - 型の等しいことを示す* - それはもう一つの '='を書こうとしないHaskellのことです。ここの型は '=' (例えば、List.headを 'List.filter'にプラグインするので' 'a - > bool''は' 'b list - > 'b''と同じでなければなりません。手元側と右辺は*なので - 「a」は「bリスト」に、「bool」は「b」に等しい) – Carsten