为什么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中的定义。我对此定义有以下问题:
MonadZero
和MonadPlus
消失了。 他们是有用的类。 在符号中出现模式匹配失败的情况...
zero
。 左零法则适用( zero >>= k = zero
),所以你知道应该发生什么。 fail msg
,其中msg
是GHC编译器生成的。 任何事情都可能发生,并不保证其语义。 因此,这对用户来说不是什么功能。 因此,Haskell 98的符号模式匹配失败的行为是不可预知的! 名称不太一般(如map
与fmap
)。 不是一个大问题,但它是我眼中的一根刺。
总而言之,我认为这些变化并不是最好的。 事实上,我认为他们是从Haskell 1.4退步的。 为什么这些事情为了Haskell 98而改变,为什么这样呢?
顺便说一下,我可以想象以下防御措施:
fail
允许查找错误。” 只适用于程序员,并且只能在运行时。 (不可移植的!)错误信息不完全是你想要解析的东西。 如果你真的关心它,你应该明确地跟踪它。 我们现在有failure
包中的Control.Failure
,它在这方面做得更好( failure x
行为大部分zero
)。 SimplePrelude
,而大多数类都被删除? 这只是一个魔法宣言,对于学生来说,他们可以管理那么多。 (也许还需要{-# LANGUAGE RebindableSyntax #-}
,但同样,学生们非常擅长复制粘贴内容。) fmap
远远超过通常map
,那么为什么不map
和listMap
呢? 为什么这些事情为了Haskell 98而改变,为什么这样呢?
Haskell 98对语言进行了大量的简化(其中大部分已经被颠倒过来)。 目标是改进Haskell作为教学语言,并作出相对保守的选择。
见例如
我们认为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?