我正在學習 Haskell。我有一個看起來像這樣的串列:
data TwoValueList a = Empty | Node a a (TwoValueList a)
我希望這樣做Foldable,這樣我就可以進行如下計算:
sum (Node 0 1 (Node 2 3 Empty)) --should produce 6
如果只有一個值,那就很容易了:
data OneValueList = Empty | Node a (OneValueList a)
instance Foldable OneValueList where
foldr f b Empty = b
foldr f b (Node a rest) = f a (foldr f b rest)
但是,如果一個節點內有兩個值,我不能細化型別,因為f需要a和b,但我必須同時應用于s 內的f兩個asTwoValueList并以某種方式組合它們。我是否缺少其他型別的約束?
謝謝你。
uj5u.com熱心網友回復:
data TwoValueList a = Empty | Node a a (TwoValueList a)
instance Foldable TwoValueList where
foldr _ ini Empty = ini
foldr f ini (Node x y xs) = f x $ f y $ foldr f ini xs
它的作業方式是foldr在遞回實體上遞回呼叫自身TwoValueList,這些實體相互嵌入,直到遇到Empty。在這一點上,它回傳ini初始值,并且呼叫堆疊出現在上面進一步決議所有函式呼叫。
uj5u.com熱心網友回復:
我發現只定義foldMap方法更容易:
data TwoValueList a = Empty | Node a a (TwoValueList a)
instance Foldable TwoValueList where
foldMap _ Empty = mempty
foldMap f (Node x y r) = f x <> f y <> foldMap f r
uj5u.com熱心網友回復:
只需撥打f兩次,并給予一個值給每個呼叫:foldr f b (Node x1 x2 xs) = f x1 (f x2 (foldr f b xs))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/359158.html
標籤:哈斯克尔
上一篇:Haskell中的回傳型別多型性
下一篇:帶可能的分數型別
