1

のような関数があるとしますmap zipWith。どのようにその型を決定できますか? isの型とiszipWithの型が(a -> b -> c) -> [a] -> [b] -> [c]map(a -> b) -> [a] -> [b]

同様に、次のような関数のタイプをどのように決定しますzipWith sumか?

4

3 に答える 3

5

:t他の回答で述べたように、GHCi のタイプを で確認できます。自分で調べてみたい場合は、必要に応じて型を置き換える必要があります。最初の例では、

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]

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

の最初の引数はmap1 つの引数の関数であるため、そのような関数と見なす必要がzipWithあります。

zipWith :: (a -> b -> c) -> ([a] -> [b] -> [c])

(上記の型は元の型と同等です。これは、型andの引数を取る関数を、 andのリストを取るzipWith関数に変換することを意味します。)abab

map同様に、1 つの引数の関数として見ることができます。

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

ここで、型をmapの結果型 -とaなりますに入力します。a -> b -> cb[a] -> [b] -> [c]

map zipWith :: [a -> b -> c] -> [[a] -> [b] -> [c]]

PS: 関数のリストを引数として取る関数が本当に必要ですか? 必要な対応する要素を追加して 2 つのリストを圧縮するだけの場合

 zipWith (+) :: Num c => [c] -> [c] -> [c]

ではなくzipWith sum

于 2013-10-10T06:43:50.967 に答える
1

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]
于 2013-10-10T06:21:39.373 に答える