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 о ленивых шаблонах.

Другие вопросы по тегам