我不确定为什么两个中间表达式不进行类型检查。类型检查器似乎为m
的每个出现都刷新了新类型绑定。是否有扩展名允许在所有这些位置重复使用名称m
?
test :: MonadPlus m => m a
test =
let r = mzero :: m a -- fails
in let r' :: m a = mzero -- fails
in mzero
答案 0 :(得分:3)
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE UnicodeSyntax #-}
test :: ∀ m a . MonadPlus m => m a
test =
let r = mzero :: m a
in let r' :: m a = mzero
in mzero
如果您不喜欢代码中的非ASCII字符,您也可以省略-XUnicodeSyntax
并使用forall
关键字代替∀。
此关键字的作用是什么,
m
和a
,因为通用量化。现在,通常Haskell只假设任何类型变量在同一个(!)签名中尚未被提及是通用的。但r = mzero :: m a
,因此GHC知道它不应该将m
和a
作为新变量引入,但重复使用与m
。a
和test
相同
醇>