如何创建包含列表的数据类型

时间:2019-04-27 14:37:25

标签: haskell

我正在尝试创建一个包含列表的数据类型类:

data Test = [Int] deriving(Show)

但是Haskell无法解析构造函数。我在这里做错了什么,如何才能最好地实现自己的目标?

1 个答案:

答案 0 :(得分:8)

答案

您需要包含一个尚未完成的构造函数。

data Test = Test [Int]

考虑查看Haskell的几种类型声明,它们的用法和语法。

Haskell类型声明

数据

允许声明零个或多个构造子,每个构造子具有零个或多个字段

新类型

允许声明一个带有一个字段的构造函数。该字段很严格。

类型

允许创建类型 alias ,该类型可以在任意使用时与等号右侧的类型在文本上互换。

构造函数

允许创建声明类型的值。还允许分解值以获得单个字段(通过模式匹配)

示例

数据

data Options = OptionA Int | OptionB Integer | OptionC PuppyAges
      ^           ^     ^      ^        ^        ^         ^
      |           |   Field    |        |        |         |
    type         Constructor   |        |     Constructor  |
                         Constructor   Field              Field
    deriving (Show)

myPuppies = OptionB 1234

新类型

newtype PuppyAges = AgeList [Int] deriving (Show)

myPuppies :: PuppyAges
myPuppies = AgeList [1,2,3,4]

由于类型(PuppyAges)和构造函数(AgeList)位于不同的命名空间中,因此人们可以并且经常为每个命名空间使用相同的名称,例如newtype X = X [Int]

类型

type IntList = [Int]

thisIsThat :: IntList -> [Int]
thisIsThat x = x

构造函数 s(更多)

option_is_a_puppy_age :: Options -> Bool
option_is_a_puppy_age (OptionC _) = True
option_is_a_puppy_age () = False

option_has_field_of_value :: Options -> Int -> Bool
option_has_field_of_value (OptionA a) x = x == a
option_has_field_of_value (OptionB b) x = fromIntegral x == b
option_has_field_of_value (OptionC (AgeList cs)) x = x `elem` cs

increment_option_a :: Options -> Options
increment_option_a (OptionA a) = OptionA (a+1)
increment_option_a x           = x