[英]Haskell recursive data type for appending
我正在学习Haskell,遇到了我不太了解的事情。 我具有以下递归数据类型:
data TList a = Tnil | Tcons (TList a) a
当我看到这一点时,我将其理解为使用通用类型a创建名为TList的数据类型。 那有两个构造函数Tnil和Tcons。 基本上,我试图添加一个附加两个列表的函数,所以我编写了以下模式匹配函数:
tappend :: TList a -> TList a -> TList a
tappend (Tcons t h) y = Tcons h (tappend t y)
我在尝试运行它时总是收到错误消息,内容是“无法将预期类型'TList(TList a)'与实际类型'a'相匹配”而且,如果有人可以分解我创建的数据类型那很好啊。 递归部分就是我无法绕过它的地方。
在您的定义中有时有些不常见 :
data TList a = Tnil | Tcons (TList a) a
在此, Tcons
具有第一个参数TList a
,其后是a
。 因此,这意味着您可能首先要指定一个init
(列表的第一部分),然后是last
(最后一个元素)。 通常,链表是用相反的方式定义的: Tcons
首先具有一个head
( a
),然后是一个tail
: TList a
包含列表的其余部分。
但是,现在让我们使用上面的定义。 让我们检查参数:
tappend :: TList a -> TList a -> TList a
tappend (Tcons t h) y = Tcons h (tappend t y)
在右侧,我们看到您构造了一个新的Tcons
,但是作为第一个参数,使用h
,它是一个a
,作为第二个参数,您使用tappend ty
会生成一个列表,因此您调用了具有翻转参数的构造函数。 我们可以用以下方法解决它:
tappend :: TList a -> TList a -> TList a
tappend (Tcons t h) y = Tcons (tappend t y) h
但是现在我们仍然会遇到错误,因为我们没有考虑遇到Tnil
应该采取的Tnil
,在这种情况下,我们可以返回第二个列表:
tappend :: TList a -> TList a -> TList a
tappend Tnil y = y
tappend (Tcons t h) y = Tcons (tappend t y) h
现在该函数将编译并运行。 但是结果有点奇怪。 如果我们使用例如:
tappend [1, 4, 2, 5] [1, 3, 0, 2]
(当然我们不能使用列表语法),我们将获得以下输出:
tappend [1, 3, 0, 2, 1, 4, 2, 5]
因此,实际上我们将以翻转的方式附加这些内容。 对我来说,不是很清楚如何需要tappend
函数的语义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.