如何获取具有 Bounded 实例的类型的 maxBound

MMa*_*ail 2 haskell bounded-types

以下 Haskell 代码无法编译:

\n\n
getMaxBound :: (Bounded a) => a -> a\ngetMaxBound _ = maxBound :: a\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到的错误如下:

\n\n
Could not deduce (Bounded a1) arising from a use of \xe2\x80\x98maxBound\xe2\x80\x99\n  from the context: Bounded a\n    bound by the type signature for:\n               getMaxBound :: Bounded a => a -> a\n    at rot13.hs:3:1-36\n
Run Code Online (Sandbox Code Playgroud)\n\n

为什么我无法在 Haskell 中获取有界类型的 maxBound?

\n\n

理想情况下,我会像这样使用这个函数:

\n\n
getMaxBound 3\n> 9223372036854775807\n\ngetMaxBound 'c'\n> '\\1114111'\n
Run Code Online (Sandbox Code Playgroud)\n\n

我觉得每次我有任何a具有 Bounded 实例的类型时,我应该能够获得该类型的 maxBound。

\n\n

我缺少什么?

\n

sar*_*ara 5

威廉的答案在这种情况下应该可以正常工作,但是在更复杂的情况下也可能有用的另一种选择是使用-XScopedTypeVariables

如果您将该行添加{-# LANGUAGE ScopedTypeVariables #-}到文件顶部,您的代码应该可以编译。

该扩展的作用是允许您在内部作用域中引用外部作用域的类型变量。在你的代码中,a在函数体中被隐藏,并且它和外部之间没有连接a,导致你丢失Bounded a上下文!