Можно ли в 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 , но я не уверен, как определить его, чтобы он мог хранить тот или иной тип, а также как я использую его в своих собственных функциях.