gpt4 book ai didi

haskell - 为什么 Haskell 9 是 8's standard classes made inferior to Haskell 1.3' ?

转载 作者:行者123 更新时间:2023-12-02 07:36:20 24 4
gpt4 key购买 nike

在 Haskell 98 之前,有 Haskell 1.0 到 1.4。看到这些年来的发展是非常有趣的,因为标准化 Haskell 的最早版本中添加了功能。

例如,do 表示法首先由 Haskell 1.3 标准化。 (发表于 1996 年 5 月 1 日)。在前奏中,我们找到以下定义(第87页):

-- Monadic classes

class Functor f where
map :: (a -> b) -> f a -> f b

class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a

m >> k = m >>= \_ -> k

class (Monad m) => MonadZero m where
zero :: m a

class (MonadZero m) => MonadPlus m where
(++) :: m a -> m a -> m a

Haskell 1.4 中也有相同的定义。我确实对此有一些问题(例如 MonadPlus reform 还没有发生在这里),但总的来说,这是一个非常好的定义。

这与 Haskell 98 有很大不同,其中有以下定义:

-- Monadic classes


class Functor f where
fmap :: (a -> b) -> f a -> f b


class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
fail :: String -> m a

-- Minimal complete definition:
-- (>>=), return
m >> k = m >>= \_ -> k
fail s = error s

这也是Haskell 2010中的定义。我对这个定义有以下问题:

  • MonadZeroMonadPlus 消失了。它们是有用的类(class)。
  • 如果 do 表示法中的模式匹配失败...

    • Haskell 1.3 使用。适用左零定律(零 >>= k = 零),因此您知道会发生什么。
    • Haskell 98 使用 fail msg,其中 msg 在 GHC 情况下由编译器生成。任何事情都可能发生,无法保证其语义。因此,对于用户来说,这并不是什么功能。 因此,Haskell 98 的 do 表示法中模式匹配失败的行为是不可预测的!
  • 名称不太通用(例如 mapfmap)。虽然问题不大,但就是眼中钉。

<小时/>

总而言之,我认为这些改变并不是最好的。事实上,我认为它们是 Haskell 1.4 的倒退。 为什么 Haskell 98 进行了这些更改,为什么要以这种方式进行更改?

<小时/>

顺便说一句,我可以想象以下防御:

  • fail 允许定位错误。” 仅适用于程序员,且仅在运行时。 (不可移植!)错误消息并不完全是您想要解析的内容。如果你真的关心它,你应该明确地跟踪它。现在,我们从 failure 包中获得了 Control.Failure,它在这方面做得更好(failure x 的行为大多类似于 zero )。
  • “类太多会使开发和使用变得太困难。”类太少会违反规则,而这些规则与类型一样重要。
  • “实例限制的函数更容易学习。”那么为什么没有一个 SimplePrelude 来代替,而删除了大部分类呢?对于学生来说,这只是一个神奇的声明,他们可以做到这么多。 (也许还需要 {-# LANGUAGE RebindableSyntax #-},但同样,学生非常擅长复制粘贴内容。)
  • “实例限制函数使错误更具可读性。”我使用 fmap 的频率比 map 多得多,所以为什么不使用 改为使用maplistMap

最佳答案

Why were these things changed for Haskell 98, and why in this way?

Haskell 98 对语言进行了大量简化(其中大部分已被逆转)。目标是改进 Haskell 作为教学语言,并做出相对保守的选择。

参见例如

We regarded Haskell 98 as a reasonably conservative design. For example, by that time multi-parameter type classes were being widely used, but Haskell 98 only has single-parameter type classes (Peyton Jones et al., 1997).

在:History of Haskell

还有:

Haskell 98 will by no means be the last revision of Haskell. On the contrary, we design it knowing that new language extensions (multi-parameter type classes, universal and existential quantification, pattern guards, etc, etc) are well on the way. However, Haskell 98 will have a special status: the intention is that Haskell compilers will continue to support Haskell 98 (given an appropriate flag) even after later versions of the language have been defined, and so the name `Haskell 98' will refer to a fixed, stable language.

在:Haskell98 report

因此,事情被简化了,目标是制定一个更简单的标准。

关于haskell - 为什么 Haskell 9 是 8's standard classes made inferior to Haskell 1.3' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18761302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com