[英]Haskell :How to define an instance of the constructor class Foldable for the constructor
我刚刚开始 Haskell 并且在阅读了可折叠文档之后,我正在尝试定义构造函数 class 可折叠构造函数ListBag的实例,其中: newtype ListBag a = LB [(a,Int)] deriving (Show,Eq)
为此,我有二进制 function f 适用于我的多重集的第一个元素。 这就是我尝试过的:
instance Foldable ListBag where
foldr f z (LB[]) = 0
foldr f z (LB [x]) = f i z where (i,_) = x
foldr f z (LB [x : xs]) = f i foldr f z (LB[xs]) where (i,_) = x
这是不正确的,但我能做到的最好......
知道如何纠正吗?
(是的,应该应用f
function 忽略多重性。)
模式[x]
匹配具有一个元素的列表,就像您希望的那样。 但是模式[x: xs]
也匹配一个包含一个元素的列表——它本身必须是一个列表,并且非空。 你想要(x: xs)
代替。 (同样,在该行中,您需要LB xs
,而不是LB [xs]
,因为后者试图在列表的尾部包裹一层额外的列表。)
此外,我怀疑你会更喜欢一个实例,当它看到(i,v)
时,假装有i
的v
个副本,而不是总是将i
只合并一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.