输入非违约

以下程序使用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神奇地将默认规则应用于内置数字类型(如NumIntegral ,而不是任意类型的文字。

有没有办法将这个GHC魔术扩展到默认的任何“整型”类型(比如说) Int ,即使约束不是Integral a ? 添加一个显式的default (Int) (假设这是正确的方式)并没有帮助。

更具体地说,我试图解决的问题是找到一种方法来使用一个适用的函数(^)

  • Int指数
  • Integer指数
  • 没有显式类型注释的文字指数
  • 所以任何达到这三点的解决方案都足够了。

    链接地址: http://www.djcxy.com/p/43269.html

    上一篇: Type defaulting with non

    下一篇: Using ViewPatterns and PatternSynonyms to simply pattern matches