为什么Haskell 98的标准类不如Haskell 1.3?

在Haskell 98之前,有Haskell 1.0到1.4。 随着功能被添加到最早版本的标准化Haskell中,看到多年来的发展非常有趣。

例如,该符号首先由Haskell 1.3(1996-05-01出版)标准化。 在Prelude ,我们找到了以下定义(第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改革尚未在此发生),但总的来说,这是一个非常好的定义。

这与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消失了。 他们是有用的类。
  • 在符号中出现模式匹配失败的情况...

  • Haskell 1.3使用zero 。 左零法则适用( zero >>= k = zero ),所以你知道应该发生什么。
  • Haskell 98使用fail msg ,其中msg是GHC编译器生成的。 任何事情都可能发生,并不保证其语义。 因此,这对用户来说不是什么功能。 因此,Haskell 98的符号模式匹配失败的行为是不可预知的!
  • 名称不太一般(如mapfmap )。 不是一个大问题,但它是我眼中的一根刺。


  • 总而言之,我认为这些变化并不是最好的。 事实上,我认为他们是从Haskell 1.4退步的。 为什么这些事情为了Haskell 98而改变,为什么这样呢?


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

  • fail允许查找错误。” 只适用于程序员,并且只能在运行时。 (不可移植的!)错误信息不完全是你想要解析的东西。 如果你真的关心它,你应该明确地跟踪它。 我们现在有failure包中的Control.Failure ,它在这方面做得更好( failure x行为大部分zero )。
  • “课程太多会导致开发和使用太难。” 由于班级太少而违反法律,这些法律与类型一样重要。
  • “实例限制功能更容易学习。” 那么为什么没有SimplePrelude ,而大多数类都被删除? 这只是一个魔法宣言,对于学生来说,他们可以管理那么多。 (也许还需要{-# LANGUAGE RebindableSyntax #-} ,但同样,学生们非常擅长复制粘贴内容。)
  • “实例限制功能使错误更具可读性。” 我用fmap远远超过通常map ,那么为什么不maplistMap呢?

  • 为什么这些事情为了Haskell 98而改变,为什么这样呢?

    Haskell 98对语言进行了大量的简化(其中大部分已经被颠倒过来)。 目标是改进Has​​kell作为教学语言,并作出相对保守的选择。

    见例如

    我们认为Haskell 98是一个合理保守的设计。 例如,到那时候,多参数类型类被广泛使用,但Haskell 98只有单参数类型类(Peyton Jones et al。,1997)。

    在:Haskell的历史

    和:

    Haskell 98绝不会是Haskell的最后一个版本。 相反,我们设计它知道新的语言扩展(多参数类型类,通用和存在量化,模式守卫等等)都很好。 然而,Haskell 98将会有一个特殊的地位:即使在定义了更高版本的语言之后,Haskell编译器也会继续支持Haskell 98(给定一个合适的标志),所以Haskell 98的名字将会引用一种固定的,稳定的语言。

    在:Haskell98报告

    所以,事情被简化了,目标是生成一个更简单的标准。

    链接地址: http://www.djcxy.com/p/7505.html

    上一篇: Why were Haskell 98's standard classes made inferior to Haskell 1.3's?

    下一篇: strict function from Int to Int?