Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么哈斯克尔98';s标准等级低于Haskell 1.3';s_Haskell_Standard Library - Fatal编程技术网

为什么哈斯克尔98';s标准等级低于Haskell 1.3';s

为什么哈斯克尔98';s标准等级低于Haskell 1.3';s,haskell,standard-library,Haskell,Standard Library,在Haskell 98之前,有Haskell 1.0到1.4。随着功能被添加到标准化Haskell的最早版本中,看到这些年来的发展是非常有趣的 例如,do符号首先由(1996-05-01出版)标准化。在序曲中,我们找到了以下定义(第87页): Haskell 1.4中也有相同的定义。我确实对此有一些问题(例如,这里还没有发生),但总的来说,这是一个非常好的定义 这与Haskell 98非常不同,后者的定义如下: -- Monadic classes class Functor f whe

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

例如,do符号首先由(1996-05-01出版)标准化。在序曲中,我们找到了以下定义(第87页):

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

这与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中的定义。我对这个定义有以下问题:

  • MonadZero
    MonadPlus
    都不见了。它们是有用的课程
  • 如果do符号中的模式匹配失败

    • Haskell 1.3使用
      zero
      。左零定律适用(
      Zero>=k=Zero
      ),因此您知道应该发生什么
    • Haskell 98使用
      fail msg
      ,其中
      msg
      是GHC情况下生成的编译器。任何事情都有可能发生,但不能保证其语义。因此,它对用户来说不是什么功能。因此,Haskell 98的do表示法中模式匹配失败的行为是不可预测的
  • 名称不太通用(例如,
    map
    fmap
    )。这不是什么大问题,但却是我眼中的刺


总而言之,我认为这些变化不是最好的。事实上,我认为他们比Haskell 1.4倒退了一步为什么Haskell 98会改变这些东西,为什么会这样?


另一方面,我可以想象以下辩护:

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

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

见例

我们认为Haskell 98是一种相当保守的设计。对于 例如,到那时,多参数类型的类被广泛使用 已使用,但Haskell 98只有单参数类型类(Peyton 琼斯等人,1997年)

在:

以及:

Haskell 98绝不是Haskell的最后修订版。上 相反,我们设计它时知道新的语言扩展 (多参数类型类,通用和存在) 量化、模式保护等)正在进行中。 然而,Haskell 98将有一个特殊的地位:其目的是 Haskell编译器将继续支持Haskell 98(给定 适当的标志),即使在更新了语言版本之后 已定义,因此名称“Haskell 98”将引用固定的、稳定的 语言

在:


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

答案很好!在第二个源代码中,有一个很好的更改列表。我想我应该看看1997年到1998年间的邮件列表档案。我已经发现了一些有趣的电子邮件,例如,SPJ,和。一个原因是
map
被重命名为
fmap
map
专门用于列表,这是因为在列表上映射时得到的错误消息对新手更友好。想象一下,作为Haskell(或一般编程)的新手,只想更改列表中的值,您会收到一条关于
没有(Functor f0)实例的错误消息
!我想我在一旁反驳了两次:新手可以使用
SimplePrelude
(拥有
map=listMap
),更高级的用户可以选择使用
listMap
,而不是
map
。我只想指出新手对它的看法,因为你没有特别提到这一点。你的建议的问题在于,他们使专家成为可能了解Haskell对新手友好的一面的人群,而新手将难以理解Haskell默认的专家一面——这与一门易学的语言所想要的恰恰相反!与你所建议的相反,已经存在于。
-- 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