gpt4 book ai didi

list - Haskell 中列表生成的奇怪结果

转载 作者:行者123 更新时间:2023-12-02 04:05:40 25 4
gpt4 key购买 nike

来自Ranges in Haskell (GHCi)非常清楚为什么 [2, 2..20] 生成无限列表。

下一个值是相同的,这就是为什么此代码生成无限列表的原因。

看起来它并不关心限制,因为 [2, 2..2] 还生成无限列表。

问题:

为什么下面的代码[2, 2..(-20)]生成空列表?

最佳答案

简而言之:这是预期行为。

[x, y..z]表达式是 enumFromThenTo x y z 的语法糖与 enumFromThenTo :: a -> a -> a -> [a] .

对于Integer它的实现如下:

instance  Enum Integer  where
# ...
enumFromThenTo x y lim = enumDeltaToInteger x (y-x) lim

所以它会调用enumDeltaToInteger 2 0 (-20) enumDeltaToInteger is implemented with [src] :

enumDeltaToInteger :: Integer -> Integer -> Integer -> [Integer]
enumDeltaToInteger x delta lim
| <b>delta >= 0 = up_list x delta lim</b>
| otherwise = dn_list x delta lim

所以它被认为是 up_list ,以及up_list将增加直到达到大于 lim 的值:

up_list :: Integer -> Integer -> Integer -> [Integer]
up_list x0 delta lim = go (x0 :: Integer)
where
go x | <b>x > lim = []</b>
| otherwise = x : go (x+delta)

Haskell'10 report on the Enum class 中是这样描述的:

The sequence enumFromThenTo e1 e2 e3 is the list [e1,e1 + i,e1 + 2i,…e3], where the increment, i, is e2 − e1. If the increment is positive or zero, the list terminates when the next element would be greater than e3; the list is empty if e1 > e3. If the increment is negative, the list terminates when the next element would be less than e3; the list is empty if e1 < e3.

所以文档说,如果“步骤”为零或更多,并且 e1 > e3 ,那么结果是空列表。

但这确实是一个“棘手”的案例。我个人同意使用 0 的特殊情况因为“步骤”是有意义的(尽管我本身并不是说这比使用 up_list 实现更有利)。但这就是事物的定义方式。

关于list - Haskell 中列表生成的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57357454/

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