围绕着ghci,我碰巧注意到表达式(*) 1 [1..5]显然有一个有效的类型.
:t (*) 1 [1..5]
(*) 1 [1..5] :: (Enum t, Num [t], Num t) => [t]
Run Code Online (Sandbox Code Playgroud)
显然它是一个包含几个类型约束的列表,包括Num [t]对我来说看起来不可能,就像它应该给出错误一样.
这是表达式的类型怎么样?为什么ghci的:t命令不在这里给出一个错误?
Dan*_*ner 10
Num [t] 这不仅是可能的,而且很简单:
import Control.Applicative
liftA0 = pure -- hobgoblins, simple minds, etc.
liftA1 = fmap
instance Num t => Num [t] where
(+) = liftA2 (+)
(-) = liftA2 (-)
(*) = liftA2 (*)
negate = liftA1 negate
abs = liftA1 abs
signum = liftA1 signum
fromInteger n = liftA0 (fromInteger n)
Run Code Online (Sandbox Code Playgroud)
因此,GHC产生错误而不是推断您的表达式可以通过适当的实例很好地输入是很糟糕的.
当然,在实际代码中编写这个实例也很糟糕,但GHC不应该像我们人类那样对代码进行判断.