我正在尝试创建一个包含列表的数据类型类:
data Test = [Int] deriving(Show)
但是Haskell无法解析构造函数。我在这里做错了什么,如何才能最好地实现自己的目标?
答案 0 :(得分:8)
您需要包含一个尚未完成的构造函数。
data Test = Test [Int]
考虑查看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