gpt4 book ai didi

haskell - 在 Haskell 中使用递归数据类型创建向后列表

转载 作者:行者123 更新时间:2023-12-02 08:53:58 25 4
gpt4 key购买 nike

我正在尝试使用 Haskell 的递归类型创建一个向后列表

data RevList a = Snoc a (RevList a) | Lin
deriving Show

mkrevlst [] = Lin
mkrevlst (x:xs) = mkrevlst xs Snoc x

当我执行 > mkrevlst [1,2,3] 时,我期望的输出是: ((Lin Snoc 3) Snoc 2) Snoc 1

当我运行这个时,我收到一个错误。我是 Haskell 的新手,我无法弄清楚错误在哪里。我哪里出错了?

谢谢。

最佳答案

我不确定这一行应该是什么,但它没有意义:

mkrevlst (x:xs) = mkrevlst xs Snoc x 

表达式mkrevlist xs可能具有类型RevList a,因为上面的基本情况返回Lin。将其应用于另外两个参数确实会导致类型错误。

看起来就像您希望在中缀中使用Snoc,这是正确的吗?在 Haskell 中,由字母数字字符组成的标识符是前缀,除非用反引号括起来,例如mkrevlist xs `Snoc` x。由符号组成的标识符是中缀的,除非用括号括起来,并且中缀数据构造函数必须以冒号开头。所以你也可以像这样定义你的数据类型:

data RevList a = a :| (RevList a) | Lin
deriving Show

另外,请注意,即使您确实使用 Snoc infix,其参数的顺序仍然与您在 mkrevlist 中使用它的顺序相反。

关于haskell - 在 Haskell 中使用递归数据类型创建向后列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6420606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com