Существует ли в Haskell эквивалент абстрактных классов ООП, использующий алгебраические типы данных или полиморфизм?

Можно ли в Haskell написать функцию с сигнатурой, которая может принимать два разных (хотя и похожих) типа данных и работать по-разному в зависимости от того, какой тип передается?

Пример может проясни мой вопрос. Если у меня есть функция с именем myFunction , и два типа с именами MyTypeA и MyTypeB , могу ли я определить myFunction , чтобы он мог принимать только данные типа MyTypeA или MyTypeB в качестве первого параметра?

type MyTypeA = (Int, Int, Char, Char)
type MyTypeB = ([Int], [Char])

myFunction :: MyTypeA_or_MyTypeB -> Char
myFunction constrainedToTypeA = something
myFunction constrainedToTypeB = somethingElse

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

public abstract class ConstrainedType {
}

public class MyTypeA extends ConstrainedType {
    ...various members...
}

public class MyTypeB extends ConstrainedType {
    ...various members...
}

...

public Char myFunction(ConstrainedType a) {
    if (a TypeOf MyTypeA) {
        return doStuffA();
    }
    else if (a TypeOf MyTypeB) {
        return doStuffB();
    }
}

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

32
задан Don Stewart 2 May 2011 в 21:07
поделиться