您需要为每个备选方案添加构造函数名称:
data NumPair = Pair (Int, Int) | More (Int, NumPair) deriving (Eq, Show)
这些构造函数名称使您可以对数据类型进行模式匹配,如下所示:
f :: NumPair -> A
f (Pair (x, y )) = ...
f (More (x, np)) = ...
然后,您可以使用构造函数来构建一个值(这就是它们被称为构造函数的原因):
myNumPair :: NumPair
myNumPair = More (1, More (2, Pair (3, 4)))
还有另外两种方法可以改进你的类型。Haskell 构造函数具有对多个字段的内置支持,因此您可以直接在构造函数中列出值,而不是使用元组,如下所示:
data NumPair = Pair Int Int | More Int NumPair deriving (Eq, Show)
您可以改进它的另一种方法是认识到您刚刚为非空列表编写了类型。非空列表的最佳实现位于Data.List.NonEmpty
包semigroups
中,您可以在此处找到。
然后你的类型就变成了:
type NumPair = NonEmpty Int
...并且您可以从该模块免费获得一堆非空列表上的功能。
编辑:nm 让我注意到你可能想要的是:
data NumPair = Pair (Int, Int) | More ((Int, Int), NumPair)
...相当于:
type NumPair = NonEmpty (Int, Int)
不同之处在于,后一个允许您附加整数对,而前一个跟随您的问题类型仅允许您附加整数。