繁体   English   中英

用于追加的Haskell递归数据类型

[英]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首先具有一个heada ),然后是一个tailTList 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM