gpt4 book ai didi

haskell - 为什么会这样评价?

转载 作者:行者123 更新时间:2023-12-03 12:59:27 25 4
gpt4 key购买 nike

我有这个功能

doubleMe :: Num a => [a] -> [a]
doubleMe [] = []
doubleMe (x:xs) = (2*x):(doubleMe xs)

考虑一下:
doubleMe(doubleMe([1,2,3]))

第一步显然是
doubleMe(doubleMe([1,2,3])) = doubleMe(2:doubleMe[2,3])

因为没有其他可能性。

这是我想知道的下一步。为什么是
doubleMe(2:doubleMe[2,3]) = 4:(doubleMe(doubleMe([2,3])))

代替
doubleMe(2:doubleMe[2,3]) = doubleMe(2:4:doubleMe([3]))

?

到目前为止我能想出的唯一答案是

Because it makes sense. Otherwise Haskell wouldn't act lazily on lists.



但这不是答案,而是逃避。真正的答案是什么?

最佳答案

The first step is obviously doubleMe(doubleMe([1,2,3])) = doubleMe(2:doubleMe[2,3])



嗯其实不明显!

为了区分,
doubleMe' = doubleMe

并考虑
doubleMe' $ doubleMe [1,2,3]

第一步按照你说的进行的唯一原因,即
≡ doubleMe' $ 2 : doubleMe [2,3]

是因为 doubleMe'需要能够将其参数匹配到 []_:_ .为此,运行时开始评估 doubleMe [1,2,3]一点,即一个递归步骤。产生 2 : doubleMe [2,3] ,足够 doubleMe'跟...共事:
≡ 4 : doubleMe' (doubleMe [2,3])

请注意,实际上该语言不需要此评估顺序:允许编译器对其重新排序(例如出于性能原因),因此实际上内部列表会立即被完全处理 – 如果 它可以证明这不会改变语义,即对于无限列表, doubleMe [1..]如果你只要求前几个结果,一定不要陷入永恒的循环。

GHC 不会进行这种重新排序。

关于haskell - 为什么会这样评价?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23010993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com