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