Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Category:

Вредные сигнатуры (загадка)

foo (x:y:_) = x == y
foo [_] = foo []
foo [] = False
Перед нами годный, рабочий код на хаскеле. Добавляете сигнатуру типа для foo - возникает ошибка. Без сигнатуры код работает. Сигнатура правильная. Почему так происходит? Комменты скринятся.

Upd:Из 16 ответивших 5: Антиламер, Адепт, lomeo, oxij, helvegr и eminglorion дали разные части правильного ответа. Ждём остальных корифеев. Всем правильно ответившим присваивается звание корифея Хаскеля 3-й степени вне очереди.

Часть отвечавших ответила не на тот вопрос. То, что неоднозначность исправляется указанием типа для [] - это понятно, но это запрещённый приём. Вопрос в том, почему при добавлении сигнатуры для foo возникает ошибка, а без сигнатуры для foo сигнатура для [] не требуется. Почему компилятор ругается на тип, который сам же и выводит.

Аноним использовал запрещённый приём, переписал пример на "эквивадентный" и не увидел ошибки вообще. Ему подсказка: его вариант нифига не эквивалентен, как это ни странно.

Upd2: Полный ответ (которого я не знал на момент задавания вопроса) пришёл с неожиданной стороны. Ах ты ж ёбаный ты нахуй, надо срочно садиться системы типов учить, в неожиданном месте пробел оказался.
Tags: fp, programming
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 22 comments