无法推断使用' minBound'

时间:2017-05-01 00:57:33

标签: haskell types

这可能是一个愚蠢的问题,但为什么这个功能

myTest :: (Bounded a) => a
myTest = minBound :: a

不是typecheck?

这有效

myTest' :: Int
myTest' = minBound :: Int

它们对我来说似乎是一样的,除了必须输入前者(例如myTest :: Int)以使其工作。

我得到的错误是

• Could not deduce (Bounded a1) arising from a use of ‘minBound’
  from the context: Bounded a
    bound by the type signature for:
               myTest :: Bounded a => a

1 个答案:

答案 0 :(得分:9)

您必须使用ScopedTypeVariables启用{-# LANGUAGE ScopedTypeVariables #-},这允许您使用函数本身内部的函数签名中的类型变量。您还需要按如下方式更改示例:

{-# LANGUAGE ScopedTypeVariables #-}

myTest :: forall a. (Bounded a) => a
myTest = minBound :: a

forall告诉编译器确定a的范围。没有明确forall的定义具有默认(unscoped)行为。

否则,函数内的a与主类型签名中的a不同(由编译器更改为a1)。它不能推断a1仅限于某些其他类型a有界的上下文。

第二个例子有效,因为Int不是一个类型变量,它是一个具体的类型,这意味着无论类型变量是什么类型变量还是不在范围内,它都引用相同的类型。

Further Reading