这可能是一个愚蠢的问题,但为什么这个功能
myTest :: (Bounded a) => a
myTest = minBound :: a
不是类型检查?
这有效
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
最佳答案
您必须启用 ScopedTypeVariables
使用 {-# LANGUAGE ScopedTypeVariables #-}
,它允许您在函数本身内部使用函数签名中的类型变量。您还需要按如下方式更改示例:
{-# LANGUAGE ScopedTypeVariables #-}
myTest :: forall a. (Bounded a) => a
myTest = minBound :: a
forall
告诉编译器范围 a
.没有明确的定义 forall
具有默认(无范围)行为。否则,
a
函数内部是不同的a
(由编译器更改为 a1
)而不是主类型签名中的那个。不能推断a1
仅与某些其他类型 a
的上下文有关是有界的。第二个示例有效,因为
Int
不是类型变量,它是具体类型,这意味着无论什么类型的变量在范围内或不在范围内,它都引用相同的类型。Further Reading
关于haskell - 由于使用 'minBound' 无法推断(有界 a1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43712935/