0

嗨,我目前正在尝试在前奏中使用 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]

谢谢

4

1 回答 1

7

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

list = [A 12, B 1 5]

第三,您声明用作boolelem :: 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 那样通过统一工作。你应该从基础开始阅读一本好的教程或书籍。

于 2012-05-24T15:30:12.010 回答