如何制作代数数据类型列表
Posted
技术标签:
【中文标题】如何制作代数数据类型列表【英文标题】:How to make a algebraic data type list 【发布时间】:2012-05-24 15:18:40 【问题描述】:您好,我目前正在尝试在 prelude 中使用 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 的大列表,我想从大列表中挑选一两个类型修改它然后放回去,我该怎么做? 经验。 大列表=[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]
谢谢
【问题讨论】:
你尝试了什么?以上不是有效的 Haskell。 【参考方案1】:首先,它是data
而不是Data
。
其次,您在定义list
时将类型变量(Int
)与值混合,而_
只能用于模式匹配。你应该写这个来构建一个[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 那样通过统一工作。你应该从基础开始阅读一本好的教程或书籍。
【讨论】:
我认为您还应该提到elem
的类型是Eq a => a -> [a] -> Bool
:-)
哎呀,我没有尝试编译代码,我完全错过了:)以上是关于如何制作代数数据类型列表的主要内容,如果未能解决你的问题,请参考以下文章