我刚开始学习Haskell,对ranges的行为感到惊讶。
我知道[1, 2 .. 10]是enumFromThenTo 1 2 10的语法糖。
从其他编程语言(例如Python),我习惯于使用第一、最后和步骤参数指定范围,这样Haskell的范围就相当于Python中的first+step。
为什么Haskell会使用,而不是步骤来定义序列中值之间的间距?
发布于 2017-03-14 14:19:38
注意,例如Python的范围说明符是一个函数
>>> range(1, 12, 2)
[1, 3, 5, 7, 9, 11]Haskell的目标是提供语法,从字面上看,您可能会为另一个人写出列表,编写..而不是“显而易见”的模式:
ghci> [1, 3 .. 11]
[1,3,5,7,9,11]卡尔在对左撇子回答的评论中提到的另一点是,序列语法可以用于非数字类型,在这种情况下,编写“步骤”的方法并不那么简单:
ghci> ['a', 'f' .. 'z']
"afkpuz"发布于 2017-03-14 16:01:04
只是在本和卡尔所说的基础上:
Enum中定义的函数是多态的。
λ> :t enumFromThenTo
enumFromThenTo :: Enum a => a -> a -> a -> [a]通过将它们定义为“第一、第二、最后”,我们可以对所有参数使用相同的多态类型参数a!
如果我们将它们定义为“第一步、最后一步”,那么step参数可能具有与其他两种参数不同的类型。
step的类型修正为某种整数类型?(但哪一个呢?)所以我们需要(我想!)要将另一个类型变量添加到Enum类型,这将使它变得更加复杂,而且(可能还没有检查)需要GHC扩展而不是标准Haskell。
发布于 2017-03-14 14:08:08
我同意,国际海事组织的开始阶段结束会是更好的惯例。然而,从开始到结束更常见于纯粹的数学语境,这是哈斯克尔的传统。
请注意,您可以很容易地通过手工实现。
而开始-然后结束需要首先手工计算步骤。
let step = then - start
in takeWhile (< end+step/2) $ iterate (+step) start因此,为更难手动实现的表达式添加语法糖/标准函数是有意义的。
https://stackoverflow.com/questions/42788070
复制相似问题