2010-10-18 2 views
3

Я пишу Haskell, но это может быть применено к любому OO или функциональному языку с концепцией ADT. Я дам шаблон в Haskell, игнорируя тот факт, что арифметические операторы уже приняты:Что называется этим абстрактным типом данных?

class Thing a where 
    (+) :: a -> a -> a 
    (-) :: a -> a -> a 
    x - y = x + negate y 
    (*) :: (RealFrac b) => a -> b -> a 
    negate :: a -> a 
    negate x = x * (-1) 

В основном это вещи, которые могут быть добавлены и вычитаются, а также умноженные на реальных дробных значений. Одним из примеров может быть простой список чисел: сложение и вычитание попарно (в Haskell, «(+) = zipWith (+)»), а умножение на вещественное умножает каждый элемент в списке на ту же сумму. Я встречал достаточно других примеров, чтобы определить его как класс, но я точно не знаю, как его назвать.

В Haskell его обычно представляет собой моноид при условии наличия нулевого значения.

Это какой-то известный вид объекта в зоопарке алгебраических типов? Я просматривал кольца, полукольцы, близость, группы и т. Д., Не найдя его.

+2

Я бы предложил избегать термина ADT в целом, его можно было бы использовать для «Алгебраических типов данных» или «Абстрактные типы данных», как на языке OO. Я как бы пропустил вопрос из-за этой двусмысленности. –

ответ

9

Это векторное изображение: http://en.wikipedia.org/wiki/Vector_space. У вас есть сложение и скалярное умножение.

+2

также, если Haskell - это язык, который вы кодируете (и вы не возражаете против использования языковых расширений) есть хорошая библиотека в Hackage, называемая «вектор-пространство», у которой уже есть класс для этого. – mokus

+0

Спасибо. Это то, что я хочу. И спасибо мокусу за то, что он указал мне на пакет. –

+1

Существует хорошая иерархия структур алгебр в http://hackage.haskell.org/package/numeric-prelude –

Смежные вопросы