Haskell :如何定义构造函数的实例 class 构造函数可折叠
Haskell :How to define an instance of the constructor class Foldable for the constructor
我刚刚开始 Haskell,在阅读 Foldable 文档后,我正在尝试定义构造函数的实例 class 可折叠的构造函数 ListBag 其中:
newtype ListBag a = LB [(a,Int)] deriving (Show,Eq)
为了这个目标,我有一个二元函数 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
函数时应忽略多重性。)
模式 [x]
匹配只有一个元素的列表,正如您所希望的那样。但是模式 [x : xs]
also 匹配一个包含一个元素的列表——它本身必须是一个列表,并且非空。你想要 (x : xs)
代替。 (同样,在该行中,您需要 LB xs
,而不是 LB [xs]
,因为后者试图在列表尾部包裹一层额外的列表。)
此外,我猜你会更喜欢一个实例,当它看到 (i,v)
时,假装有 v
个 i
的副本,而不是总是包含 [=17] =] 正好一次。
我刚刚开始 Haskell,在阅读 Foldable 文档后,我正在尝试定义构造函数的实例 class 可折叠的构造函数 ListBag 其中:
newtype ListBag a = LB [(a,Int)] deriving (Show,Eq)
为了这个目标,我有一个二元函数 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
函数时应忽略多重性。)
模式 [x]
匹配只有一个元素的列表,正如您所希望的那样。但是模式 [x : xs]
also 匹配一个包含一个元素的列表——它本身必须是一个列表,并且非空。你想要 (x : xs)
代替。 (同样,在该行中,您需要 LB xs
,而不是 LB [xs]
,因为后者试图在列表尾部包裹一层额外的列表。)
此外,我猜你会更喜欢一个实例,当它看到 (i,v)
时,假装有 v
个 i
的副本,而不是总是包含 [=17] =] 正好一次。