【问题标题】: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。

标签: 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 :-)
  • 哎呀,我没有尝试编译代码,我完全错过了:)
猜你喜欢
  • 2020-11-27
  • 2020-04-30
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 2013-07-04
相关资源
最近更新 更多