这可能是一个愚蠢的问题,但为什么这个功能
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
答案 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
不是一个类型变量,它是一个具体的类型,这意味着无论类型变量是什么类型变量还是不在范围内,它都引用相同的类型。