のような関数があるとしますmap zipWith
。どのようにその型を決定できますか? isの型とiszipWith
の型が(a -> b -> c) -> [a] -> [b] -> [c]
map
(a -> b) -> [a] -> [b]
同様に、次のような関数のタイプをどのように決定しますzipWith sum
か?
:t
他の回答で述べたように、GHCi のタイプを で確認できます。自分で調べてみたい場合は、必要に応じて型を置き換える必要があります。最初の例では、
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
と
map :: (a -> b) -> [a] -> [b]
の最初の引数はmap
1 つの引数の関数であるため、そのような関数と見なす必要がzipWith
あります。
zipWith :: (a -> b -> c) -> ([a] -> [b] -> [c])
(上記の型は元の型と同等です。これは、型andの引数を取る関数を、 andのリストを取るzipWith
関数に変換することを意味します。)a
b
a
b
map
同様に、1 つの引数の関数として見ることができます。
map :: (a -> b) -> ([a] -> [b])
ここで、型をmap
の結果型 -とa
なりますに入力します。a -> b -> c
b
[a] -> [b] -> [c]
map zipWith :: [a -> b -> c] -> [[a] -> [b] -> [c]]
PS: 関数のリストを引数として取る関数が本当に必要ですか? 必要な対応する要素を追加して 2 つのリストを圧縮するだけの場合
zipWith (+) :: Num c => [c] -> [c] -> [c]
ではなくzipWith sum
。
You can see its type in ghci:
ghci> :t map zipWith
map zipWith :: [a -> b -> c] -> [[a] -> [b] -> [c]]
Similarly for zipWith sum
:
ghci> :t zipWith sum
zipWith sum :: Num (b -> c) => [[b -> c]] -> [b] -> [c]