在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中尝试相同的方法
f1 x accumulator | x == 0 = accumulator
| otherwise = f1 (x-1) accumulator++[x]现在,下面的f2是相同的函数,只是我在列表的开头追加了元素。
f2 x accumulator | x == 0 = accumulator
| otherwise = f2 (x-1) [x]++accumulator奇怪的是,这两个函数对相同的输入返回相同的顺序。为什么?
例如:
[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 6 []返回1,2,3,4,5,6
f2 6 []也返回1,2,3,4,5,6。
发布于 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和,而不是因此:
f1 6 []
= (f1 5 [])++[6]
= ((f1 4 [])++[5])++[6]
...
= (...((f1 0 []) ++ [1]) ++ ...) ++ [6]
= [1,2,3,4,5,6]和
f2 6 []
= (f2 5 [6])++[]
= ((f2 4 [5])++[6])++[]
...
= ((...((f2 0 [1])++[2])++ ...) ++ [6]) ++ []
= [1,2,3,4,5,6]关于运算符与函数应用程序的优先顺序,请参阅this question。
https://stackoverflow.com/questions/50688789
复制相似问题