【发布时间】: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 是数字,或者是 Show、Eq 或 Ord。
并且 GHC 有一个名为 ExtendedDefaultRules 的扩展程序可以启用这些规则。然而,这个扩展非常具体:它只适用于 GHC 和标准类。例如,可以考虑不使用标准库的库。在这种情况下,GHCi 扩展将不起作用。
我的问题是:像 GHCi 那样扩展 Haskell 的类型默认规则的唯一方法是使用编译器扩展?还有更通用的:有没有办法根据 Haskell 98 中约束的一些规则来定义类型默认?
【问题讨论】:
-
没有办法做你想做的事。如果你能想出一个好的设计,我们都在听。当前的默认类型是疣。
-
类似:
instance (MyShow a) => MyShow (Maybe a) where .... defaulting (Int)。编译器可以检查类型是否不明确,在这种情况下是默认的。在上面的情况下,Nothing 将具有 Maybe Int 类型。当然,您可以仅对满足约束的类型进行默认设置。 -
@mariop 我知道你对这个想法很兴奋,但目前它似乎有点半生不熟。有很多事情要考虑,比如:如果有很多约束都有不同的默认值,你应该怎么做?图书馆用户如何影响图书馆的默认选择以更符合他们的需求?为什么实例是附加默认指令的规范正确位置?您的解决方案能否推广到多参数类型类(以及fundeps 和类型族)?我确信还有许多其他难题需要完整的提案来解决。
-
这只是一个 5 分钟的想法,并不现实。我对此并不兴奋。我对这篇文章的想法是更好地理解问题以及如何解决这个限制,而不是提出解决方案。感谢两位的回答。
标签: haskell type-systems