gpt4 book ai didi

haskell - Haskell (GHCi) 中的范围

转载 作者:行者123 更新时间:2023-12-03 08:46:12 24 4
gpt4 key购买 nike

我正在阅读 Learn You A Haskell for Great GoodHis examples [2,2..20][3, 6..20] 工作正常,但我得到了三个奇怪的结果:

  • 从 1 到 171 按 17 计数:[17, 1..171] 产生空列表。
  • 从 17 到 1711111 按 17 计数:[17, 17..171111] 重复数字 17 直到我中断 GHCi。
  • take 54 [171, 234..]take 54 [171, 244..] 之间有一个奇怪的区别:
     ghci> take 54 [171, 234..]
    [171,234,297,360,423,486,549,612,675,738,801,864,927,990,1053,1116,1179,1242,1305,1368,1431,1494,1557,1620,1683,1746,1809,1872,1935,1998,2061,2124,2187,2250,2313,2376,2439,2502,2565,2628,2691,2754,2817,2880,2943,3006,3069,3132,3195,3258,3321,3384,3447,3510]

    ghci> take 54 [171, 244..]
    [171,244,317,390,463,536,609,682,755,828,901,974,1047,1120,1193,1266,1339,1412,1485,1558,1631,1704,1777,1850,1923,1996,2069,2142,2215,2288,2361,2434,2507,2580,2653,2726,2799,2872,2945,3018,3091,3164,3237,3310,3383,3456,3529,3602,3675,3748,3821,3894,3967,4040]

  • 为什么?

    最佳答案

    你有稍微偏离范围的意思。 Haskell 范围语法是以下四种之一:[first..] , [first,second..] , [first..last] , [first,second..last] .来自 Learn You A Haskell 的示例是

    ghci> [2,4..20]  
    [2,4,6,8,10,12,14,16,18,20]
    ghci> [3,6..20]
    [3,6,9,12,15,18]

    请注意,在第一种情况下,列表按两个计数,在第二种情况下,列表按三个计数。那是因为第一项和第二项之间的差异分别是二和三。在您的语法中,您尝试编写 [first,step..last]获取列表 [first,first+step,first+2*step,...,last] ;但是,这样的范围的步长实际上是前两个数字之间的差异。没有第二个元素,步长总是一;并且没有最终元素,列表将永远存在(或直到达到该类型的最大/最小元素)。

    因此,让我们看一下您的三个示例:
  • [17,1..171] == [] .由于您指定 17,1 ,Haskell 看到列表的前两个元素应该是 17 和 1,因此您必须按 -16 计数.在这种情况下,Haskell 想要在元素小于最后一个元素时立即停止——但它们以这种方式开始,因此不会产生任何元素。要加一,您需要 [17,18..171] (列表的前两个元素是 17 和 18),或者只是 [17..171] .
  • [17, 17..171111] == repeat 17 .这个很好玩由于列表的前两个元素都是 17 , Haskell 确定你必须从零开始计数——它会很高兴地继续计数,直到结果超过 171111 .当然,当从零开始计数时,这永远不会发生,因此您会得到一个无限的 17 列表。要计数到 17,您需要 [17,34..171111] , 或 [17,17+17..171111]如果您认为这更清楚。
  • take 54 [171,234..]take 54 [171,244..] .我不确定你在这里期待什么行为,但他们每个人所做的都与上面相同:第一个返回一个由 54 个整数组成的列表,从 171 开始。并按 234 - 171 = 63 计算;第二个返回一个包含 54 个整数的列表,从 171 开始并按 244 - 171 = 73 计算.每个列表无限远(或至少直到 maxBound ,如果列表是有限的 Ints 并且不是任意大的 Integers ),因此您只需请求前 54 个元素。

  • 有关范围语法含义的一些更具体的细节(它被转换为 Enum 类型类中的函数),包括浮点数范围的稍微令人惊讶的行为, hammar has a good answer to another question .

    关于haskell - Haskell (GHCi) 中的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7958181/

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