我正在尝试使用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可以使用infix,对吗?在Haskell中,由字母数字字符组成的标识符为前缀,除非被反引号括起来,例如mkrevlist xs `Snoc` x。除非用括号括起来,否则由符号组成的标识符为infix,并且infix数据构造函数必须特别以冒号开头。因此,您也可以像这样定义数据类型:
data RevList a = a :| (RevList a) | Lin
    deriving Show

另外,请注意,即使您确实使用了Snoc中缀,其参数的顺序仍然比您在mkrevlist中的用法相反。

10-06 00:59