您好我正在尝试在前奏中使用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]
由于
答案 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那样统一工作。你应该从基础开始阅读一本好的教程或书。