2

の型を導出しようとしています(.) (foldr(++)) (map (:))

の型を導出することから始めます。foldr (++)

foldr :: (a1 -> b1 -> b1) -> b1 -> [a1] -> b1
(++)  :: [a2] -> [a2] -> [a2]

a1 ~ [a2]
b1 ~ [a2]
b1 ~ [a2]

そう

foldr (++) :: [a2] -> [[a2]] -> [a2] ~ [a] -> [[a]] -> [a]

次に、型を導出しますmap (:)

map :: (a1 -> b1) -> [a1] -> [b1]
(:) :: a2 -> [a2] -> [a2]

a1 ~ a2
b1 ~ [a2] -> [a2]

そう

map (:) :: [a2] -> [[a2] -> [a2]] ~ [a] -> [[a] -> [a]]

最後にタイプは(.) (foldr(++)) (map (:))

(.) :: (b1 -> c1) -> (a1 -> b1) -> a1 -> c1
map (:) :: [a2] -> [[a2] -> [a2]]
foldr (++) :: [a3] -> [[a3]] -> [a3]

b1 ~ [a2]
c1 ~ [[a2] -> [a2]]
a1 ~ [a3]
b1 ~ [[a3]] -> [a3]

だから私は得る

(.) (foldr(++)) (map (:)) :: a1 -> c1 ~ [a3] ->  [[a2] -> [a2]]

しかし、GHCi に問い合わせると:t (.) (foldr(++)) (map (:))(.) (foldr(++)) (map (:)) :: [a] -> [[[a] -> [a]]] -> [[a] -> [a]]

私の結果とはどれが異なりますか、同じ結果を導き出すための助けはありますか?

ありがとう、
セバスチャン。

4

2 に答える 2

3

よくわかりませんがb1、構成f . gでは の出力がgの入力と一致する必要があるため、 に対して 2 つの制約を生成したという事実を見逃したと思いますf。その事実から始めて、入力と出力置き換えることで、構成のタイプを推測するのがより簡単になる可能性があります。

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

[b] ~ [[a] -> [a]]
 b  ~  [a] -> [a]

foldr (++) . map (:) :: [a]                 -> [[b         ]] -> [b         ]
                      ~ [a]                 -> [[[a] -> [a]]] -> [[a] -> [a]]
于 2014-05-02T20:30:07.543 に答える