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