当前位置:  开发笔记 > 编程语言 > 正文

haskell类型类中的多个类型参数

如何解决《haskell类型类中的多个类型参数》经验,为你挑选了1个好方法。

我正在尝试在Haskell98中做一些抽象,但不知道该怎么做.

我想要做的是为可以转换为列表的类型定义一个类.

toList :: a -> [b]

但我不知道如何为这个方法定义一个类.我提出了以下三个想法:

class ToList a b where
    toList :: a -> [b]

class ToList a where
    toList :: a -> [b]

class ToList a where
    toList :: a b -> [b]

第一个不起作用,因为Haskell98不允许多个参数类.

第二个不起作用,因为b依赖于a而不能为每个b实现.

第三个也不起作用,因为我不知道如何使用"b"不是最后一个类型参数的类型来实现类.

data HTree a b = Nil | Node a b (HTree a b) (HTree a b)

toList Nil = []
toList Node x y l r = toList l ++ [(x,y)] ++ toList r

要么

toList Nil = []
toList Node x y l r = toList l ++ [x] ++ toList r

我该怎么办呢?



1> luqui..:

另请参见标准库中的Data.Foldable,它toList为任何Foldable实例提供函数. Foldable需要一些复杂的实例化,但这将是一个很好的做法.作为奖励,您的HTree类型几乎与文档中的示例实例完全相同.

另外,我建议您HTree改为:

data HTree a = Nil | Node a (HTree a) (HTree a)

然后使用HTree (a,b)而不是HTree a b.这个单参数版本可以更容易地与标准类型和实例组合,并且它可以更多地达到正在发生的事情,因为它以相同的方式依赖于两个参数.它也是一个Functor,定义这样一个实例将使这种类型非常好用.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有