【问题标题】:Haskell: Defaulting constraints to typeHaskell:默认约束类型
【发布时间】:2010-05-18 23:53:30
【问题描述】:

考虑这个例子:

applyKTimes :: Integral i => i -> (a -> a) -> a -> a
applyKTimes 0 _ x = x
applyKTimes k f x = applyKTimes (k-1) f (f x)

applyThrice :: (a -> a) -> a -> a
applyThrice = applyKTimes 3

applyThrice 中的 3 被 GHC 默认为 Integer,如使用 -Wall 编译时所示:

Warning: Defaulting the following constraint(s) to type 'Integer'
         'Integral t'
           arising from a use of 'applyKTimes'

所以我猜Integer 是默认的Integral a => a

  • 是否也可以为其他约束定义“默认类型”?
  • 使用默认类型是不好的做法吗? (使用-Wall..时确实会抱怨)

【问题讨论】:

    标签: haskell typeclass


    【解决方案1】:

    是的,you can,虽然它不像为每个类型类添加一个默认值那么简单,它只适用于Num 及其在Prelude 和标准库中的子类。语法为default (t1, ..., tn),每个模块只能使用一个这样的声明。

    例如,添加default (Int) 会将代码中Integral 的默认值更改为Int

    (Integer, Double) 的默认默认值不仅仅是 GHC 策略:它来自 Haskell 98 Report。 (不过,GHCi 确实有 extended default rules。)

    这里是a discussion 当前系统的一些问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-21
      • 2015-09-06
      • 1970-01-01
      • 2013-08-19
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多