Экземпляры суперкласса Haskell по умолчанию

Я хочу взять некоторые шаблоны из объявлений Num для нескольких пользовательских классов (назовем их мономиальными и полиномиальными). Вместо того, чтобы писать

instance Num (Monomial) where
    f - g = f + (negate g)
    abs _ = undefined

Есть ли способ обойти это? Я наткнулся на экземпляры суперкласса по умолчанию и что-то под названием "улучшение strathclyde haskell", которое, если оно будет реализовано, позволит мне написать что-то вроде

class SimpleNum a => Num a where
    (+) :: a -> a -> a -- standard ring stuff
    (*) :: a -> a -> a
    one :: a
    zero :: a
    instance Num (SimpleNum a) where
        f - g = f + (negate g)
        abs _ = undefined

Каков обычный/простой способ справиться с этим?


person gatoatigrado    schedule 03.05.2011    source источник
comment
Может быть, это частично связано с тем, что дизайн Num не очень хорош, т.е. он должен быть AbelianGroup => Ring => Num ...   -  person gatoatigrado    schedule 03.05.2011
comment
это часть этого, но тогда мы не могли бы иметь значения по умолчанию для методов менее конкретных классов типов с точки зрения членов более конкретных классов, так что это было бы слишком отстойно :-(. Хотя, по крайней мере, тогда наш код не У меня должны быть все эти дармовые днища...   -  person SamB    schedule 03.05.2011
comment
ОНА реализована. Не знаю, есть ли эта фича, но SHE — настоящий препроцессор, которым можно пользоваться.   -  person luqui    schedule 03.05.2011
comment
Знакомы ли вы с Numeric Prelude, haskell.org/haskellwiki/Numeric_Prelude? По крайней мере, это обеспечивает более разумное число.   -  person John L    schedule 03.05.2011
comment
@John L: Большое спасибо, это очень полезно!!   -  person gatoatigrado    schedule 04.05.2011


Ответы (1)


Обычные способы справиться с этим — сделать по крайней мере одно или несколько из следующего:

  1. Много ворчать.

  2. Напишите вспомогательные функции следующим образом:

simpleMinus f g = f + (negate g)
  1. Используйте такие инструменты, как Template Haskell и Извлечение.

  2. Попытайтесь реализовать расширения, подобные тому, которое вы упомянули. (К сожалению, это не так просто, как вы думаете.)

person SamB    schedule 03.05.2011
comment
Спасибо, я, наверное, просто напишу это на этот раз, так как у меня всего несколько функций, но полезно знать о Template Haskell и Derive. - person gatoatigrado; 03.05.2011