我正在尝试在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
我该怎么办呢?
另请参见标准库中的Data.Foldable,它toList
为任何Foldable
实例提供函数. Foldable
需要一些复杂的实例化,但这将是一个很好的做法.作为奖励,您的HTree
类型几乎与文档中的示例实例完全相同.
另外,我建议您HTree
改为:
data HTree a = Nil | Node a (HTree a) (HTree a)
然后使用HTree (a,b)
而不是HTree a b
.这个单参数版本可以更容易地与标准类型和实例组合,并且它可以更多地达到正在发生的事情,因为它以相同的方式依赖于两个参数.它也是一个Functor
,定义这样一个实例将使这种类型非常好用.