微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Haskell:如何为构造函数定义构造函数类Foldable 的实例

如何解决Haskell:如何为构造函数定义构造函数类Foldable 的实例

我刚刚开始使用 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 函数时应忽略多重性。)

解决方法

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

此外,我怀疑你会更高兴看到一个实例,当它看到 (i,v) 时,假装有 vi 副本,而不是总是包含 i正好一次。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。