Подтвердить что ты не робот

Определение функции уравнениями с различным числом аргументов

Сегодня я заметил, что такое определение

safeDivide x 0 = x
safeDivide = (/)

невозможно. Мне просто интересно, какая (хорошая) причина этого. Должен быть очень хороший (это Хаскелл в конце концов:)).

Примечание. Я не ищу предложения для альтернативных реализаций кода выше, это простой пример, чтобы продемонстрировать мою точку.

4b9b3361

Ответ 1

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

Там также есть небольшая семантическая причуда: скажем, компилятор заполнил такие предложения, чтобы иметь одинаковое количество шаблонов, как и другие предложения; т.е. ваш пример станет

safeDivide x 0 = x
safeDivide x y = (/) x y

Теперь рассмотрим, была ли вместо второй строка safeDivide = undefined; в отсутствие предыдущего предложения safeDivide будет , но благодаря выполненному здесь эта-расширению он \x y -> if y == 0 then x else ⊥ - поэтому safeDivide = undefined фактически не определяет safeDivide как ! Это кажется довольно запутанным, чтобы оправдать запрет таких статей, ИМО.

Ответ 2

Значение функции с несколькими предложениями определяется стандартом Haskell (раздел 4.4.3.1) посредством перевода в лямбда и case:

fn pat1a pat1b = r1
fn pat2a pat2b = r2

становится

fn = \a b -> case (a,b) of
  (pat1a, pat1b) -> r1
  (pat2a, pat2b) -> r2

Это так, что способ определения функции/случая делает что-то приятное и последовательное, а значение каждого из них не указано избыточно и смутно.

Этот перевод действительно имеет смысл, когда каждое предложение имеет такое же количество аргументов. Конечно, могут быть дополнительные правила, чтобы исправить это, но они усложнили перевод для небольшого выигрыша, поскольку вы, вероятно, не захотели бы так или иначе определять такие вещи, ради ваших читателей.

Ответ 3

Haskell делает это так, потому что это предшественники (например, LML и Miranda). Нет никаких технических причин, по которым это должно быть так; уравнения с меньшим числом аргументов могут быть расширены. Но наличие разного количества аргументов для разных уравнений, вероятно, является опечаткой, а не преднамеренной, поэтому в этом случае мы запрещаем что-то разумное и редко удается получить отчет об ошибках в общем случае.