【发布时间】:2019-08-17 23:43:14
【问题描述】:
我正在尝试了解创建的代数数据类型的语法。我创建的类型是[Int] 或Empty,类似于Maybe 与Just 和Nothing,除了Just 必须是Int 的列表。当它接受两个输入并给出相同类型的输出时,我无法理解如何操作创建的类型。
data Example = Arg [Int]
| Empty
deriving Show
我使用模式匹配并理解必须解决每种情况;但是,我的问题来自最终模式的语法,Empty 都不是。我正在尝试编写两个函数:一个结合来自Example 构造函数的[Int] 列表,并且我想创建一个只显示一组[Int] 共享的函数,而不是组合。
第一个问题是合并两个集合。我可以在普通函数中执行此操作,但在某个地方,使用 Example 数据类型,语法已关闭,我不熟悉它。第二个最大的问题是相同的:我了解递归,但我不了解创建的数据类型中递归的语法。我也在考虑在第二个函数中使用where 语句,但如果我不能正确获得基本递归的语法,那么我怀疑它会成功。
combine :: Example -> Example -> Example
combine Empty Empty = Empty
combine (Arg xs) Empty = (Arg xs)
combine Empty (Arg ys) = (Arg ys)
combine (Arg xs) (Arg ys) = Arg xs ++ ys
same :: Example -> Example -> Example
same _ Empty = Empty
same Empty _ = Empty
same (Arg x : xs) (Arg y : ys)
| x == y = x
| otherwise = same (Arg xs) (Arg ys)
combine 的输出应该是一个 [Int] 列表,其中包含两个列表中的所有 Ints;如果一个列表为空,它应该返回整组非空列表。
same 的输出应该包含一个[Int] 列表,该列表仅包含两个组共享的数字,没有重复;如果一组为空,则输出为空。
【问题讨论】:
-
我注意到的唯一问题(现在无法测试)是函数的输出应该使用
Arg构造函数 - 例如。combine的前 2 个案例应导致Arg [] -
哦,
same函数还有一些问题。Arg x : xs应该是Arg (x : xs)。您还没有涵盖任一参数为Arg []的情况。并且(在最终模式中的x == y守卫中)您不能将x作为输出。 -
在试图理解
same函数可能打算做什么时——Arg []和Empty之间的“含义”是否应该有所不同?如果是这样,它是什么? -
您在
combine的最后一行缺少括号。要通过类型检查器,它应该是... = Arg (xs ++ ys)。这是不对的(如果您不想在结果中包含重复的元素),但至少它会进行类型检查。 ---same (Arg x : xs) (Arg y : ys) = ...也错了:应该是same (Arg (x : xs)) (Arg (y : ys)) = ... -
你有很多问题都在一篇文章中混乱。如果您使用/关于 one 代码 sn-p 提出一个具体的、重点突出的问题,您将获得更好的投资回报率。即最小代码,如minimal reproducible example。但事实证明,我之前的评论回答了您的新编辑。您只需要在
(Arg (x:xs))等内部的(x:xs)周围添加括号,因为您现在拥有的内容被解释为(Arg x) : xs。
标签: haskell recursion pattern-matching algebraic-data-types