为什么Haskell的范围语法首先使用而不是使用First和Step?

Joe*_*Joe 7 haskell range

我刚刚开始学习Haskell,并且对范围的行为感到惊讶.

我知道这[1, 2 .. 10]是语法糖enumFromThenTo 1 2 10.

从其他编程语言(比如Python)的我已经习惯了被范围内使用指定第一,最后参数,这样Haskell的是相当于第一+步 Python编写的.

为什么使用的Haskell 然后,而不是步骤,以限定在序列中的值之间的间隔?

Ben*_*Ben 8

请注意,例如Python的范围说明符是一个函数:

>>> range(1, 12, 2)
[1, 3, 5, 7, 9, 11]
Run Code Online (Sandbox Code Playgroud)

Haskell的目标是提供一种语法,从字面上看,你可能会写出另一个人的列表,..而不是"明显的"模式:

ghci> [1, 3 .. 11]
[1,3,5,7,9,11]
Run Code Online (Sandbox Code Playgroud)

另一点(由Carl在关于leftaroundabout的答案的评论中提出)是序列语法可以用于非数字类型,其中没有这么简单的方法来编写"步骤":

ghci> ['a', 'f' .. 'z']
"afkpuz"
Run Code Online (Sandbox Code Playgroud)


DNA*_*DNA 5

只是建立Ben和Carl所说的:

Enum中定义的函数是多态的,例如

?> :t enumFromThenTo
enumFromThenTo :: Enum a => a -> a -> a -> [a]
Run Code Online (Sandbox Code Playgroud)

通过将它们定义为"第一个,第二个,最后一个",我们可以a为所有参数使用相同的多态类型参数!

如果我们将它们定义为"first,last,step",那么step参数可能与其他两个类型不同.

  • 对于整数序列,该步骤也是整数 - 没问题.
  • 对于字符序列,该步骤也是一个整数 - 所以也许我们可以将类型固定step为某种整数类型?(但是哪一个?)
  • 但是没有 - 对于浮动序列,步骤也需要浮动!

所以我们需要(我认为!)将另一个类型变量添加到Enum类型类中,这会使它变得更复杂,并且(可能 - 没有检查)需要GHC扩展而不是标准的Haskell.