Ответ 1
По умолчанию самые внешние шаблоны, используемые в привязках let
, являются ленивыми. Тем не менее, шаблоны, используемые в привязках лямбда, строги, поэтому шаблон совпадает с кортежем слишком рано. Вы можете явно написать ленивое совпадение шаблонов, префиксное с помощью ~
, делая шаблон лямбды эквивалентным шаблону let
:
ghci> fix (\(~(x, y)) -> (y, 1))
(1,1)
Это отклоняет фактическую оценку соответствия шаблона, пока одна из связанных переменных не будет принудительно, а не когда вызывается функция, избегая цикла.
Для получения дополнительной информации см. статью Haskell wiki по ленивым шаблонам.