【发布时间】:2021-04-28 00:15:41
【问题描述】:
我刚刚开始使用 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 函数忽略多重性。)
【问题讨论】:
-
一个值
LB [(x,2), (y,3)]是否意味着代表两个x和三个y?是这样,你需要产生f x (f x (f y (f y (f y z))))。您不能将整数传递给f,也不能从foldr返回整数,就像您现在正在尝试做的那样。 -
@chi 他们没有将整数传递给
f,即使在纠正了他们的模式匹配之后。 -
@chi 感谢您抽出宝贵时间,是的,这就是
LB的创建方式,但目前我想将 f 应用于第一个元素 忽略多重性。 -
我明白了。给定
list :: [(a,Int)],我们有map fst list :: [a],因此您可以将foldr应用于标准列表。如果您想改正您的方法,请不要将LB [x]或LB [x:xs]用于您的模式。要匹配非空列表,您需要改用LB (x:xs),或LB ((x,_):xs)仅获取第一个组件。 -
@DanielWagner 啊,对。我被
i这个名字弄糊涂了,我认为它是Int组件。