haskell - 由于使用 'minBound' 无法推断(有界 a1)

标签 haskell types

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

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/

相关文章:

regex - 如何在 regex-tdfa 正则表达式中控制 CompOption "multiline"? ( haskell )

haskell - 什么是类型量词?

haskell - IO Monad 中的链式 if/else 语句

regex - 在 Haskell 中使用正则表达式进行分词

networking - 在 Haskell 中列出网络接口(interface)

types - VHDL:使用 std_logic 数组与使用 std_logic_vector 子类型

postgresql - 如何将主键从整数转换为序列?

TypeScript 扩展接口(interface)/类型的所有值类型

types - 如何从usize中减去isize?

haskell - 为什么要使用类型类而不是模式匹配?