Обобщенные правила по умолчанию для типов

правила Haskell по умолчанию по умолчанию тип переменной 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 является числовым, или показать, эквалайзер или ОГА.

и GHC имеет расширение называется ExtendedDefaultRules, которые позволяют эти правила. Однако это расширение очень специфично: оно работает только на GHC и со стандартными классами. Например, можно подумать о библиотеках, которые не используют стандартную библиотеку. В этом случае расширение GHCi не будет работать.

мой вопрос: единственный способ расширить правила по умолчанию типа Haskell, такие как GHCi, - это с расширениями компилятора? И более общий: есть ли способ определить тип-по умолчанию, на основе определенных правил об ограничениях в Haskell 98?

1 ответов


нет никакого способа сделать то, что вы хотите.

текущая ситуация обеднена по дизайну. Идея заключалась в том, чтобы сделать что-то минимальное, что может быть расширено в будущем, когда у нас будет хороший дизайн.