为什么哈斯克尔98';s标准等级低于Haskell 1.3';s
在Haskell 98之前,有Haskell 1.0到1.4。随着功能被添加到标准化Haskell的最早版本中,看到这些年来的发展是非常有趣的 例如,do符号首先由(1996-05-01出版)标准化。在序曲中,我们找到了以下定义(第87页): Haskell 1.4中也有相同的定义。我确实对此有一些问题(例如,这里还没有发生),但总的来说,这是一个非常好的定义 这与Haskell 98非常不同,后者的定义如下:为什么哈斯克尔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
-- 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
是GHC情况下生成的编译器。任何事情都有可能发生,但不能保证其语义。因此,它对用户来说不是什么功能。因此,Haskell 98的do表示法中模式匹配失败的行为是不可预测的李>msg
- Haskell 1.3使用
- 名称不太通用(例如,
与map
)。这不是什么大问题,但却是我眼中的刺fmap
总而言之,我认为这些变化不是最好的。事实上,我认为他们比Haskell 1.4倒退了一步为什么Haskell 98会改变这些东西,为什么会这样?
另一方面,我可以想象以下辩护:
- “
允许定位错误。”仅适用于程序员,并且仅适用于运行时。(不可移植!)错误消息并不是您想要解析的内容。如果你真的关心它,你应该明确地跟踪它。我们现在有了fail
来自Control.Failure
包,它在这方面做得更好(Failure
的行为大部分类似于Failure x
)zero
- “太多的类使得开发和使用太困难。”太少的类违反了它们的规律,这些规律和类型一样重要
- “受实例限制的函数更容易学习。”那么,为什么没有一个
,而将大多数类都删除了呢?对学生来说,这只是一个神奇的宣言,他们可以做到这一点。(也许也需要SimplePrelude
,但同样,学生们非常擅长复制粘贴东西。){-#语言可重新绑定语法#-}
- “实例限制函数使错误更具可读性。”我使用
的频率比fmap
高得多,那么为什么不使用map
和map
listMap
因此,事情被简化了,目的是产生一个更简单的标准。答案很好!在第二个源代码中,有一个很好的更改列表。我想我应该看看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