如何制作代数数据类型列表

时间:2012-05-24 15:18:41

标签: haskell

您好我正在尝试在前奏中使用elem功能。

data MyType = A Int
            | B Int Int
            | C Int
            | D Int Int
     deriving (Show,Eq)

list = [ A _, B _ _ ]    

list = [ A Int, B Int Int ]

bool = (A 12) elem list  -- use like this to get a Boolean value.

问题是列表,它会(都)有编译错误。有人能告诉我定义列表的正确方法吗?

关于数据并在我的主代码中导出(Show,Eq),我做了所有这些。这个问题的原因是我有一个很大的MyType列表,我想从大清单中选择一两种类型修改它然后把它放回去,我该怎么做? 进出口。 bigList = [A 3,C 6,A 5,B 5 8,D 5 6] 我想只挑选数据类型(A Int)和(B Int Int),可能会将两种数据类型的所有值都更改为0,修改后放回去,所以我最终得到一个新列表。 newBigList = [A 0,C 6,A 0,B 0 0,D 5 6]

由于

1 个答案:

答案 0 :(得分:7)

首先,它是data而不是Data。 其次,您将类型变量(Int)与定义list中的值混合,而_只能用于模式匹配。您应该编写此代码来构建类型[MyType]的列表:

list = [A 12, B 1 5]

第三,您对bool的声明使用elem :: Eq a => a -> [a] -> Bool作为中缀运算符,而它是一个与其他任何函数一样的函数。写下

bool = elem (A 12) list

bool = (A 12) `elem` list

elem的类型签名中可以看出,您需要派生Eq类型类。能够打印MyType值也很有用,因此您可以考虑在类型声明的末尾添加deriving (Eq,Show)

看起来你错误地将Haskell误认为Prolog。 Haskell不像Prolog那样统一工作。你应该从基础开始阅读一本好的教程或书。