2016-07-09 5 views

答えて

3

ghci:tコマンドを使用して、任意の式のタイプを調べることができます。

GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help 
Prelude> :t flip foldr id 
flip foldr id 
    :: Foldable t => (a -> (a1 -> a1) -> a1 -> a1) -> t a -> a1 -> a1 
10

実際にはhaskellには推測作業は含まれていませんので、座ってGHCiの助けを借りてこれを行うのが最善です。

したがって、これらの関与の基本的な種類があり、私たちは最高始めましょうとGHCiの

$ > ghci 
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help 
Prelude> :t flip 
flip :: (a -> b -> c) -> b -> a -> c 
Prelude> :t foldr 
foldr :: Foldable t => (a1 -> b1 -> b1) -> b1 -> t a1 -> b1 
Prelude> :t id 
id :: a2 -> a2 

を起動。

明示的な親子化を使用すると、foldr :: Foldable t => (a -> b -> b) -> b -> (t a -> b)は、折り返し関数と関数を返す開始値をとる関数です。

型レベル上のすべての小文字は、(タイプ)の変数なので、私たちは、あなたがflip関数の最初のパラメータを挿入した

foldr :: Foldable t => (a1 -> b1 -> b1) -> b1 -> t a1 -> b1 
         **************  ** ********** 
flip ::    ( a   -> b -> c ) -> (b ->  a   ->  c  ) 
                   ***  **************  ********** 
flip foldr :: Foldable t =>         b1 -> (a1 -> b1 -> b1) -> (t a1 -> b1) 

心代用を開始することができます - ので、それはに表示されませんがもうタイプシグネチャ。

さらにあなたはidはとてもそれが私たちに与え代入しそうb1 ~ (a2-> a2)その後、開始値で見ることができます:

flip foldr id :: Foldable t => (a1 -> (a2 -> a2) -> (a2 -> a2)) -> (t a1 -> (a2 -> a2)) 

flip foldr id :: Foldable t => (a1 -> (a2 -> a2) -> a2 -> a2) -> t a1 -> a2 -> a2 

そして、何この手順の素晴らしいところ再び明示的な括弧を省略します - GHCiのすべてのステップをチェックして、あなたの(等式)推論が正しいかどうかを調べることができます。

いくつかの注意事項:

  • GHCiのは、常に最も一般的な署名を推測しよう - あなたは

    foldr :: (a -> b -> b) -> b -> [a] -> b 
    

を期待するならば、GHC-バージョンの後半で7.8よりもあなたが表示されます私が上記に書いた署名。あなたはfoldr :: MyAB a b -> b -> [a] -> bが正しい専門で、その後type MyAB a b = (a -> b -> b)を持っているので、もし

  • type -aliasesは混乱するかもしれませんが、あなたはおそらくGHCiの中でこれは表示されません。
関連する問題