我刚刚开始学习Haskell,并且对范围的行为感到惊讶.
我知道这[1, 2 .. 10]是语法糖enumFromThenTo 1 2 10.
从其他编程语言(比如Python)的我已经习惯了被范围内使用指定第一,最后和步参数,这样Haskell的则是相当于第一+步 Python编写的.
为什么使用的Haskell 然后,而不是步骤,以限定在序列中的值之间的间隔?
请注意,例如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)
只是建立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.
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |