首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在这个函数中,在开头或结尾追加都无关紧要?Haskell

为什么在这个函数中,在开头或结尾追加都无关紧要?Haskell
EN

Stack Overflow用户
提问于 2018-06-05 05:07:46
回答 1查看 43关注 0票数 0

在haskell中,1,2,3,4,5++6给出了1,2,3,4,5,6,而6++1,2,3,4,5给出了6,1,2,3,4,5。

但现在让我们在递归函数f1和f2中尝试相同的方法

代码语言:javascript
运行
复制
f1 x accumulator | x == 0 = accumulator
                 | otherwise = f1 (x-1) accumulator++[x]

现在,下面的f2是相同的函数,只是我在列表的开头追加了元素。

代码语言:javascript
运行
复制
f2 x accumulator | x == 0 = accumulator
                 | otherwise = f2 (x-1) [x]++accumulator

奇怪的是,这两个函数对相同的输入返回相同的顺序。为什么?

例如:

代码语言:javascript
运行
复制
[1,2,3,4,5]++[6]

返回1,2,3,4,5,6

代码语言:javascript
运行
复制
[6]++[1,2,3,4,5]

返回6,1,2,3,4,5

代码语言:javascript
运行
复制
f1 6 []

返回1,2,3,4,5,6

代码语言:javascript
运行
复制
f2 6 []

也返回1,2,3,4,5,6。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 05:23:34

这个问题很有趣。您被误导了,因为您在以下表达式中(错误地)将较高优先级赋予了++运算符:

  • f1 (x-1) accumulator++[x]意味着(f1 (x-1) accumulator)++[x],而不是 f1 (x-1) (accumulator++[x])
  • 同样,f2 (x-1) [x]++accumulator表示(f2 (x-1) [x]) ++ accumulator,而不是

因此:

代码语言:javascript
运行
复制
f1 6 []
= (f1 5 [])++[6]
= ((f1 4 [])++[5])++[6]
...
= (...((f1 0 []) ++ [1]) ++ ...) ++ [6]
= [1,2,3,4,5,6]

代码语言:javascript
运行
复制
f2 6 []
= (f2 5 [6])++[]
= ((f2 4 [5])++[6])++[]
...
= ((...((f2 0 [1])++[2])++ ...) ++ [6]) ++ []
= [1,2,3,4,5,6]

关于运算符与函数应用程序的优先顺序,请参阅this question

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50688789

复制
相关文章

相似问题

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