首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >append函数下面发生了什么?

append函数下面发生了什么?
EN

Stack Overflow用户
提问于 2013-05-18 17:53:27
回答 2查看 147关注 0票数 2

我在OCaml中得到了append函数的一个实现,但它似乎让我感到困惑

代码语言:javascript
复制
let rec append = function
| [] -> fun y -> y
| h :: t -> fun y -> h :: (append t y)

在这种情况下,fun y的用途是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-19 00:13:40

append的类型为'a list -> 'a list -> 'a list。您可以将其视为一个接受两个列表并返回一个列表的函数。但是(在OCaml中是惯用的)该函数是使用currying定义的。因此,在基本级别上,append接受第一个列表并返回一个'a list -> 'a list类型的函数。返回的函数接受第二个列表,并在其前面加上第一个列表(返回结果)。

fun y -> yappend在第一个列表为空时返回的函数。如果你仔细想想,这是有道理的。如果第一个列表为空,则第二个列表将原封不动地返回。换句话说,返回的函数与标识函数(专门应用于列表)没有任何不同。

第二种情况返回值fun y -> h :: (append t y)。这是相似的,但更复杂一点。返回的函数需要做一些实际的附加操作。它通过(递归地)将提供的第二个列表(y)附加到第一个列表(t)的尾部,然后将第一个列表(h)的头部添加到第一个列表的前面。

票数 3
EN

Stack Overflow用户

发布于 2013-05-18 19:06:52

如果您不喜欢fun,可以像这样重写函数

代码语言:javascript
复制
let rec append x y = match x with
| [] -> y
| h :: t -> h :: append t y
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16622914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档