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

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 :-) 哎呀,我没有尝试编译代码,我完全错过了:)

以上是关于如何制作代数数据类型列表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用不同类型的项目制作 RecyclerView? [复制]

多态编码的递归代数数据类型的值是多少?

如何在Haskell中与代数类型进行模式匹配

函数式编程关心类型(代数结构)之间的关系

玩 2.4 参数化代数数据类型 JSON 验证

在 Scheme (R6RS) 中表示代数数据类型构造函数的惯用方式是啥?