使用非标准前奏

时间:2016-06-30 00:43:54

标签: haskell ghc

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

是否有办法将此GHC魔法扩展为默认任何“整数外观”类型(例如)Int,即使约束不是Integral a?添加一个明确的default (Int)(假设这是正确的方法),没有用。

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

的函数(^)
  1. Int exponents
  2. Integer exponents
  3. 没有明确类型注释的文字指数
  4. 所以达到这三点的任何解决方案都足够了。

0 个答案:

没有答案