0

我刚刚开始使用 Haskell,在阅读了Foldable文档后,我试图为构造函数ListBag定义构造函数类 Foldable 的实例,其中: 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应该应用该函数忽略多重性。)

4

1 回答 1

3

[x]就像您希望的那样,该模式将列表与一个元素匹配。但是该模式[x : xs] 匹配一个包含一个元素的列表——它本身必须是一个列表,并且非空。你想要(x : xs)。(同样,在该行中,您需要LB xs,而不是LB [xs],因为后者试图在列表的尾部包裹一层额外的列表。)

此外,我怀疑你会更喜欢一个实例,当它看到 时(i,v),假装有 的v副本i,而不是总是只合并i一次。

于 2021-01-23T19:55:52.937 回答