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