2017-06-02 1 views
0

で関数 `foldr`の種類について困惑している、foldrの定義は次のとおりです。私は著書「Haskellではプログラミング」ではハスケル

foldr :: (a -> b ->b) -> b -> [a] -> b 
foldr f v [] = v 
foldr f v (x:xs) = f x (foldr f v xs) 

私は非常によくfを理解することはできません。

原因f[a]に適用され、引数a(a -> b -> b)に明らかです。 引数vb型を持つが、最後にb( - > B - >B)及び( - > B - > B) - > B - > [A] - >B奇妙です。

機能ffoldrの結果がbのタイプの結果であることを意味しますか?どのようにそれが可能になることができますか?

+1

私は「どのように可能なのでしょうか」という答えを書き始めました。質問の一部ですが、ちょっと立ち往生しました。なぜあなたはそれが不可能だと思うと言うことができますか?それは説明を導くのに役立つと私は思う。 –

答えて

2

foldr f vは値

f x1 (f x2 (... v)) 

非公式に、その "置き換え"(または "解釈")f(:)コンストラクタ、およびv[]コンストラクタにリスト

x1 : x2 : ... : [] 
-- i.e., in prefix notation 
(:) x1 ((:) x2 (... [])) 

をマッピングします。

上記の式から、fの2番目の引数としてfの結果が(何度も)使用されていることがわかります。したがって、彼らは同じタイプ(質問にb)を持っている必要があります。 foldrの最終結果は、最も外側のfの結果であるため、同じbも同様です。

3

vfoldrの可能結果であるので、あなたが認める場合vb型を持つ、そしてfoldrの結果は、タイプbを持っているがあります:foldrの結果を持っているので、

foldr f v [] = v 

そして、 bである場合、fの結果はbでなければならず、fの結果はfoldrの結果である可能性があります。

-- f and foldr have to return the same type! 
foldr f v (x:xs) = f x (foldr f v xs) 
関連する問題