LYAHには、次のようなコードがあります。Foldable.foldlはNum a => aでどのように動作するのですか
data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Show, Read, Eq)
instance F.Foldable Tree where
foldMap f Empty = mempty
foldMap f (Node x l r) = F.foldMap f l `mappend`
f x `mappend`
F.foldMap f r
ghci> F.foldl (+) 0 testTree
42
ghci> F.foldl (*) 1 testTree
64800
私の知る限りでは、foldMap
はタイプfoldMap :: (Monoid m, Foldable t) => (a -> m) -> t a -> m
のですが、Num a => a
自体はタイプMonoid
ではないので、私はFoldable.foldl
は実際にここで働いんか疑問に思って? foldMap
は内部でFoldable.foldl
と呼ばれているので、Monoid
のタイプは何ですか?
こんにちは@WillemVanOnsem、ありがとうございました。それはまさに私が混乱していることです、あなたは 'mempty = 1'と言いました、そして次に' mempty'のタイプは何ですか? 'Sum'や' Product'とは違って、 'Int'は' Monoid' AFAIKの型クラスではないので、これは分かりません。これについてもう少し説明してください。ありがとうございました –
ええと、私はハスケルに新しいです、私はそれが私が行方不明の部分だと思います。ありがとうたくさん:) –
このエンドトリックはかなり進んでいます、確かに初心者の材料ではないことに注意してください。 'foldMap(\ x - > [x]) 'を使って折り畳みを簡単なリストに変換する' foldl'実装を書いたほうが簡単かもしれませんが、モノイドは単純に '[a]'になり、リストに「foldl」が表示されます。あまり効率的ではありませんが、おそらく理解しやすいでしょう。それは良い練習のために作ることができる:) – chi