哈斯克尔范围 (GHCi)

2024-03-12

我正在阅读为你学习 Haskell 以造福人类 http://learnyouahaskell.com/. 他的例子 http://learnyouahaskell.com/starting-out#texas-ranges [2,2..20] and [3, 6..20]工作正常,但我得到了三个奇怪的结果:

  1. 从 1 到 171 按 17 数:[17, 1..171]产生空列表。
  2. 从 17 到 1711111 按 17 数:[17, 17..171111]重复数字17直到我打断 GHCi。
  3. 之间有一个奇怪的区别take 54 [171, 234..] and 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]
    

Why?


你的意思是范围稍微偏离。 Haskell 范围语法是以下四种语法之一:[first..], [first,second..], [first..last], [first,second..last]。示例来自学习 Haskell http://learnyouahaskell.com/starting-out#texas-ranges are

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];然而,这样的范围的步长实际上是前两个数字之间的差。如果没有第二个元素,则步长始终为 1;如果没有最终元素,列表将永远持续下去(或直到达到该类型的最大/最小元素)。

因此,让我们看一下您的三个示例:

  • [17,1..171] == []。既然你指定了17,1,Haskell 认为列表的前两个元素应该是十七和一,所以你必须计算-16。在这种情况下,Haskell 希望元素一出现就停止smaller比最后一个元素——但它们是这样开始的,所以不会产生任何元素。要加一,你想要[17,18..171](列表的前两个元素是 17 和 18),或者简单地[17..171].

  • [17, 17..171111] == repeat 17。这个很有趣。由于列表的前两个元素都是17,Haskell 确定您必须向上计数为零,并且它会很高兴地继续向上计数,直到结果超过171111。当然,当以零计数时,这种情况永远不会发生,因此你会得到一个无限的十七列表。要数到十七,你想要[17,34..171111], or [17,17+17..171111]如果你认为这样更清楚。

  • take 54 [171,234..] vs. take 54 [171,244..]。我不确定您在这里期望什么行为,但它们每个人所做的与上面相同:第一个返回一个包含 54 个整数的列表,从171并通过计数234 - 171 = 63;第二个返回一个包含 54 个整数的列表,从171并通过计数244 - 171 = 73。每个列表都会无限延伸(或者至少直到maxBound,如果列表是有限的Ints并且不是任意大Integers),因此您只需请求前五十四个元素。

有关范围语法含义的一些更具体的细节(它被翻译成Enum类型类),包括浮点数范围上有点令人惊讶的行为,哈马尔对另一个问题有一个很好的答案 https://stackoverflow.com/questions/7290438/haskell-ranges-and-floats/7290493#7290493.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哈斯克尔范围 (GHCi) 的相关文章

  • 缺少 Haskell 原语来连续将函数应用于列表的每个元素?

    在 Haskell 中 众所周知map原语可用于将给定函数应用于all列表的元素 gt map toUpper abcd ABCD gt 在尝试生成有限集 列表 的所有分区时 以下类似的原语会很方便 gt sap toUpper abcd
  • 不同种类的ReaderT?

    冒着成为一个XY问题 https en wikipedia org wiki XY problem 是否有可能有一个ReaderT与不同的环境 我正在尝试类似 type AppM perms ReaderT perms IO 但是编译器抱怨
  • 尝试以特殊行为渲染 Threepenny-gui 中的字段

    我想要做的是设置字段 当它们处于焦点时显示详细信息 而当它们不处于焦点时显示摘要 例如 A 当它失去焦点 变得模糊 时 我将值保存在 状态 映射中 然后将该值更改为旧值的函数 即汇总值 b 当它获得焦点时 我用我在地图中保存的旧值替换摘要值
  • 用户状态(秒差距)

    我正在使用秒差距解析一个表达式 并且我想使用秒差距中的用户状态来跟踪这些表达式中的变量 不幸的是我真的不知道该怎么做 给出以下代码 import Data Set as Set inp x y z data Var V String var
  • 通过列表搜索

    我一直在尝试定义一个函数 给定一个整数列表和一个整数 n 返回一个布尔值 指示 n 是否在列表中恰好出现一次 我有这个 但它不起作用 我无法弄清楚 once a gt a gt Bool gt Bool filter filter p x
  • 主函数抱怨返回非 IO monad

    import Debug Trace main do trace Main function parses and returns 0 return 这会引发错误 app hs 3 1 Couldn t match expected typ
  • 更新 mtl 后找不到模块“Control.Monad.State”

    我想用Control Monad Except模块 但结果发现我有一个过时的 mtl 包 它导致了导入错误 我有一个过时的模块Control Monad Error 所以我做了 sudo cabal install mtl 并且安装了2 2
  • 你在实际项目中使用过Quickcheck吗[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 快速检查 http www cs chalmers se rjmh QuickCheck 及其变体 即使有一个Java https bitbuc
  • Haskell 长度函数实现

    我正在学习 Haskell 编程 我试图理解列表是如何工作的 因此我尝试编写两个可能的length功能 myLength a gt Integer myLength foldr x gt 1 0 myLength1 a gt Integer
  • Cabal 在 NixOS 上构建时找不到外部库

    我正在尝试使用 cabal2nix 在 NixOS 上构建一个内部 Haskell 项目 它包装 并因此依赖 一个外部库 在 Ubuntu 上可以通过以下方式构建 wget设置源 然后运行make make install ldconfig
  • Foldl 是否比其严格的表亲 Foldl' 更好?

    Haskell 有两个列表左折叠函数 foldl 以及 严格 版本 foldl 不严格的问题foldl是它建造了一座重击塔 foldl 0 1 5 gt 0 1 2 3 4 5 gt 15 这会浪费内存 并且如果列表中的项太多 可能会导致堆
  • 我需要什么类型签名才能将函数列表转换为 Haskell 代码? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 haskell 中不允许这样的函数定义 https stackoverflow com questions 6168880 why is such a function definition
  • 移动列表中特定元素的简单函数

    我是 Haskell 的新手 我正在尝试弄清楚如何创建一个函数 shift Eq a gt a gt a gt Int gt a shift x h t z 输入 一个通用列表和一个相同类型的元素 x 前提条件 元素x存在于列表中 Outp
  • 在 Haskell 中阅读 GraphML

    我正在尝试将包含单个有向图的 GraphML 文件读入 HaskellData Graph http hackage haskell org package containers 0 2 0 1 docs Data Graph html为了
  • Haskell:Where 与 Let

    我是 Haskell 的新手 我很困惑Where vs Let 它们似乎都提供了相似的目的 我读过一些比较Where vs Let但我很难辨别何时使用它们 有人可以提供一些背景信息或者一些示例来说明何时使用其中一种而不是另一种吗 哪里与让
  • 让 GHC 生成“带进位加法 (ADC)”指令

    下面的代码将表示 192 位数字的两个未装箱字三元组添加到新的未装箱字三元组中 并且还返回任何溢出 LANGUAGE MagicHash LANGUAGE UnboxedTuples import GHC Prim plusWord2 Wo
  • 显示未定义的实例

    可以采取任何措施来为未定义的值定义 Show 实例吗 也许存在一些 GHC 扩展 我想要这样的东西 gt print 1 undefined 1 undefined 根据Haskell 2010 报告 第 9 章 http www hask
  • 如何使用 Haskell 中的 thyme 库从 Int 值创建 UTCTime?

    我有年 月 日 小时和分钟值 所有这些都是类型Int 我怎样才能将它们转换为UTCTime or UniversalTime 需要导入以下内容 import Control Lens import Data Thyme Clock impo
  • Haskell Cabal 包 - 找不到 Paths_ 模块

    我正在开发一个 Haskell 项目 Happstack 服务器 Blaze HTML 前端作为主要库 我想添加一个静态数据目录 看起来你可以使用 Cabal 使用自动生成的Path
  • 为什么 Haskell 中有协函子和逆变函子的区别,而范畴论却没有区别?

    这个答案是从范畴论的角度来看的 https math stackexchange com a 661989 72174包括以下语句 事实是 协函子和逆变函子之间没有真正的区别 因为每个函子只是一个协变函子 More in details a

随机推荐