Экземпляры суперкласса по умолчанию на Haskell - PullRequest
3 голосов
/ 03 мая 2011

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

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

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

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

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

1 Ответ

2 голосов
/ 03 мая 2011

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

  1. Жрать много.

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

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

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

...