繁体   English   中英

Haskell:如何定义构造函数的实例 class 可折叠的构造函数

[英]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)时,假装有iv个副本,而不是总是将i只合并一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM