Haskell имеет прекрасно работающий оператор (==)
для проверки равенства (для типов, для которых определено равенство), поэтому я предполагаю, что вы ссылаетесь здесь на что-то еще, кроме простого тестирования равенства.
Я не знаю Эрланга, но, учитывая, что вы написали equal(S, S)
, мое первое предположение было бы, что вы хотите, чтобы сопоставления с образцами выражали равенство путем повторного использования имени переменной. К сожалению, в Haskell (и в стиле ML в целом) сопоставление с образцом менее мощное, чем в таких языках, как Prolog; все, что может сделать шаблон - это связывать переменные, а не выполнять полное объединение.
Это правда, что существуют шаблоны с постоянными значениями, такие как foo [1,2] = ...
, но это просто синтаксический сахар для проверки привязки и равенства, и это делается только для постоянных значений, а не переменных.
Обычный подход на Haskell, вероятно, будет патрулями , например:
data EqualResult a b = Yep | Nope (a, b) deriving (Show, Eq)
equal :: (Eq a) => a -> a -> EqualResult a a
equal s1 s2 | s1 == s2 = Yep
| otherwise = Nope (s1, s2)
Если вы захотите получить какое-то ссылочное равенство вместо проверки на равные значения, это не сработает, потому что в Хаскеле это даже не имеет смысла.
Редактировать: Мне было указано, что вы, возможно, также спрашивали о возвращении различных типов результатов. Работа с типами должна быть хорошо рассмотрена в любом введении в Haskell, но короткая версия в этом случае такова, что если вам нужно вернуть один из двух возможных типов, вам нужен тип данных с одним конструктором для каждого; Затем вы проверяете результат, используя сопоставление с образцом (в объявлении или case
выражении).
В этом случае, чтобы она выглядела больше как ваша функция, я создал специальный тип с двумя конструкторами: один, указывающий на равенство (без дополнительных подробностей), и другой, указывающий на неравенство, содержащее пару значений. Вы также можете сделать это универсальным способом, используя встроенный тип Either a b
, который имеет два конструктора Left a
и Right b
.