在haskell

时间:2015-08-14 10:30:07

标签: haskell typeclass

我不确定为什么两个中间表达式不进行类型检查。类型检查器似乎为m的每个出现都刷新了新类型绑定。是否有扩展名允许在所有这些位置重复使用名称m

test ::  MonadPlus m => m a
test =
    let r = mzero :: m a  -- fails 
    in let r' :: m a = mzero  -- fails
       in  mzero

1 个答案:

答案 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关键字代替∀。

此关键字的作用是什么,

  1. 它引入了新类型变量ma,因为通用量化。现在,通常Haskell只假设任何类型变量在同一个(!)签名中尚未被提及是通用的。但
  2. 它在整个上下文范围内禁用自动引入类型变量。这还包括r = mzero :: m a,因此GHC知道它应该将ma作为新变量引入,但重复使用与m
  3. 的签名中的atest相同