首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么哈斯克尔的范围语法首先使用,然后,而不是第一和第一步?

为什么哈斯克尔的范围语法首先使用,然后,而不是第一和第一步?
EN

Stack Overflow用户
提问于 2017-03-14 14:01:25
回答 3查看 475关注 0票数 7

我刚开始学习Haskell,对ranges的行为感到惊讶。

我知道[1, 2 .. 10]enumFromThenTo 1 2 10的语法糖。

从其他编程语言(例如Python),我习惯于使用第一、最后和步骤参数指定范围,这样Haskell的范围就相当于Python中的first+step。

为什么Haskell会使用,而不是步骤来定义序列中值之间的间距?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-14 14:19:38

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

代码语言:javascript
复制
>>> range(1, 12, 2)
[1, 3, 5, 7, 9, 11]

Haskell的目标是提供语法,从字面上看,您可能会为另一个人写出列表,编写..而不是“显而易见”的模式:

代码语言:javascript
复制
ghci> [1, 3 .. 11]
[1,3,5,7,9,11]

卡尔在对左撇子回答的评论中提到的另一点是,序列语法可以用于非数字类型,在这种情况下,编写“步骤”的方法并不那么简单:

代码语言:javascript
复制
ghci> ['a', 'f' .. 'z']
"afkpuz"
票数 8
EN

Stack Overflow用户

发布于 2017-03-14 16:01:04

只是在本和卡尔所说的基础上:

Enum中定义的函数是多态的。

代码语言:javascript
复制
λ> :t enumFromThenTo
enumFromThenTo :: Enum a => a -> a -> a -> [a]

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

如果我们将它们定义为“第一步、最后一步”,那么step参数可能具有与其他两种参数不同的类型。

  • 对于整数序列,该步骤也是整数-没有问题。
  • 对于一个字符序列,这个步骤又是一个整数--所以也许我们可以将step的类型修正为某种整数类型?(但哪一个呢?)
  • 但是不-对于浮点序列来说,这个步骤也需要一个浮点数!

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

票数 5
EN

Stack Overflow用户

发布于 2017-03-14 14:08:08

我同意,国际海事组织的开始阶段结束会是更好的惯例。然而,从开始到结束更常见于纯粹的数学语境,这是哈斯克尔的传统。

请注意,您可以很容易地通过手工实现。

  • 开始-步骤-结束: takeWhile (
  • 开始-步骤计数: 取计数$ iterate (+步骤)开始

而开始-然后结束需要首先手工计算步骤。

代码语言:javascript
复制
let step = then - start
in takeWhile (< end+step/2) $ iterate (+step) start

因此,为更难手动实现的表达式添加语法糖/标准函数是有意义的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42788070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档