以下程序与GHC编译:
main :: IO ()
main = print $ 2^2
尽管有
的签名(^) :: (Num a, Integral b) => a -> b -> a
由于GHC的type defaulting mechanism。我正在使用numeric-prelude,而是导出
(^) :: Ring.C a => a -> Integer -> a
使用Int
指数非常烦人,所以我更喜欢Prelude的版本,带有多态指数。因此,我定义了以下内容:
{-# LANGUAGE NoImplicitPrelude, RebindableSyntax, ScopedTypeVariables #-}
import Algebra.Ring as Ring (C)
import Algebra.ToInteger as ToInteger (C)
import NumericPrelude hiding ((^))
(^) :: forall a i . (Ring.C a, ToInteger.C i) => a -> i -> a
x0 ^ y0 = undefined
main :: IO ()
main = print $ 2^2
但我没有类型默认值,因此基数和指数的模糊类型存在错误。
This是我可以找到的关于默认的文档的范围,它没有描述元组的组件实际执行的内容,也没有描述“默认”默认类型可用的文档。
仅仅是玩游戏,看起来GHC神奇地将默认规则应用于内置数字类型,如Num
和Integral
,而不是任意类型的文字。
是否有办法将此GHC魔法扩展为默认任何“整数外观”类型(例如)Int
,即使约束不是Integral a
?添加一个明确的default (Int)
(假设这是正确的方法),没有用。
更具体地说,我试图解决的问题是找到一种方法来使用一个适用于
的函数(^)
Int
exponents Integer
exponents 所以达到这三点的任何解决方案都足够了。