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

Haskell дает выражение сходится, в то время как аналогичное выражение, использующее fix, не

У меня возникли трудности с пониманием того, почему выражение haskell let (x,y) = (y,1) in (x,y) сходится к (1,1), как ожидалось, но fix (\(x,y)-> (y,1)) приводит к выбросу <<loop>>. Кто-нибудь может это объяснить?

4b9b3361

Ответ 1

По умолчанию самые внешние шаблоны, используемые в привязках let, являются ленивыми. Тем не менее, шаблоны, используемые в привязках лямбда, строги, поэтому шаблон совпадает с кортежем слишком рано. Вы можете явно написать ленивое совпадение шаблонов, префиксное с помощью ~, делая шаблон лямбды эквивалентным шаблону let:

ghci> fix (\(~(x, y)) -> (y, 1))
(1,1)

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

Для получения дополнительной информации см. статью Haskell wiki по ленивым шаблонам.