Лямбда-функции Haskell — две вроде бы эквивалентные функции, одна работает, а другая ошибочна

Эта лямбда-функция возвращает 1:

  (\x y -> 1) 1 p

где p = (\xy -> 1)

Хорошо, это имеет смысл для меня — лямбда-функция возвращает 1, независимо от его аргументы.

Теперь эта лямбда-функция генерирует ошибку (ошибка бесконечного типа):

  (\x y -> x y x) p 1

Это не имеет для меня смысла. Если эта функция применяется к аргументам, вот результат замены x на p и y на 1:

  p 1 p

Замените первое p его определением:

  (\x y -> 1) 1 p

Эй! Это идентично приведенному выше, который вернул 1.

Вопрос: почему (\xy -> 1) 1 p завершается успешно, тогда как (\xy -> xyx) p 1 терпит неудачу?

/Roger

6
задан Roger Costello 4 March 2012 в 19:56
поделиться