【问题标题】:Generalized type-defaulting rules通用类型默认规则
【发布时间】:2013-07-25 02:51:34
【问题描述】:

Haskell's type-defaulting rules 默认类型变量 a 具有约束 (C1 a,...,Cn a) 如果:

  • 类型变量a没有出现在其他约束中
  • Ci 的所有类都是标准的。
  • 至少有一个类 Ci 是数字

这对我来说很有意义,但也非常有限:实际上,这意味着当您使用自定义类时,当它不明确时,您总是必须指定类型。例如,这不会编译:

class (Show a) => MyShow a where
    myShow :: a -> String
    myShow = show

instance (MyShow a) => MyShow (Maybe a) where
    myShow Nothing = "Nothing"
    myShow (Just x) = "Just " ++ (myShow x)

main = print $ myShow Nothing -- ambiguous

GHCi 以这种方式扩展了这组规则:

  • 所有的类 Ci 都是单参数类型的类。
  • 至少有一个类 Ci 是数字,或者是 ShowEqOrd

并且 GHC 有一个名为 ExtendedDefaultRules 的扩展程序可以启用这些规则。然而,这个扩展非常具体:它只适用于 GHC 和标准类。例如,可以考虑不使用标准库的库。在这种情况下,GHCi 扩展将不起作用。

我的问题是:像 GHCi 那样扩展 Haskell 的类型默认规则的唯一方法是使用编译器扩展?还有更通用的:有没有办法根据 Haskell 98 中约束的一些规则来定义类型默认?

【问题讨论】:

  • 没有办法做你想做的事。如果你能想出一个好的设计,我们都在听。当前的默认类型是疣。
  • 类似:instance (MyShow a) => MyShow (Maybe a) where .... defaulting (Int)。编译器可以检查类型是否不明确,在这种情况下是默认的。在上面的情况下,Nothing 将具有 Maybe Int 类型。当然,您可以仅对满足约束的类型进行默认设置。
  • @mariop 我知道你对这个想法很兴奋,但目前它似乎有点半生不熟。有很多事情要考虑,比如:如果有很多约束都有不同的默认值,你应该怎么做?图书馆用户如何影响图书馆的默认选择以更符合他们的需求?为什么实例是附加默认指令的规范正确位置?您的解决方案能否推广到多参数类型类(以及fundeps 和类型族)?我确信还有许多其他难题需要完整的提案来解决。
  • 这只是一个 5 分钟的想法,并不现实。我对此并不兴奋。我对这篇文章的想法是更好地理解问题以及如何解决这个限制,而不是提出解决方案。感谢两位的回答。
  • 这里提议扩展这些规则:github.com/ghc-proposals/ghc-proposals/pull/409

标签: haskell type-systems


【解决方案1】:

没有办法做你想做的事。

目前的情况是设计使然。这个想法是做一些最小的事情,当我们有一个好的设计时可以在未来扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2012-05-03
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多