输入非违约
以下程序使用GHC进行编译:
main :: IO ()
main = print $ 2^2
尽管签署了
(^) :: (Num a, Integral b) => a -> b -> a
由于GHC的类型违约机制。 我使用数字前奏,而不是导出
(^) :: 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
但我没有得到类型的默认值,所以对于基数和指数有误差的类型。
这是我可以找到关于违约的文档的程度,它没有描述元组实际做什么,也没有描述什么时候“默认”默认类型可用。
只是从四处玩弄,看起来GHC神奇地将默认规则应用于内置数字类型(如Num
和Integral
,而不是任意类型的文字。
有没有办法将这个GHC魔术扩展到默认的任何“整型”类型(比如说) Int
,即使约束不是Integral a
? 添加一个显式的default (Int)
(假设这是正确的方式)并没有帮助。
更具体地说,我试图解决的问题是找到一种方法来使用一个适用的函数(^)
Int
指数 Integer
指数 所以任何达到这三点的解决方案都足够了。
链接地址: http://www.djcxy.com/p/43269.html下一篇: Using ViewPatterns and PatternSynonyms to simply pattern matches