Шаблоны взрыва - PullRequest
       15

Шаблоны взрыва

7 голосов
/ 28 июня 2011

Я понимаю, что в:

f x = x + 1 where !y = undefined

значение шаблона взрыва в том, что y должен быть оценен до f.

Аналогично:

f x = x + 1 where !(!a, !b) = (undefined, undefined)

значение то же самое, w.r.t x и y.

Но что означают паттерны взрыва:

f x = x + 1 where (!a, !b) = (undefined, undefined)

Кажется, это не вызывает оценку undefined. Когда вступают в силу шаблоны взрыва в кортеже? Если кортеж шаблона является принудительным? Кто-нибудь может привести пример, где (!a, !b) = (..) отличается от (a, b) = (..)?

Ответы [ 2 ]

10 голосов
/ 28 июня 2011

Шаблон взрыва на самом кортеже заставит оценить кортеж, но не его элементы. Шаблоны взрыва элементов кортежа будут вызывать их всякий раз, когда оценивается сам кортеж.

Вот пример отличающегося поведения:

Prelude> let x = a + 1 where (a, b) = (1, undefined)
Prelude> x
2
Prelude> let x = a + 1 where (!a, !b) = (1, undefined)
Prelude> x
*** Exception: Prelude.undefined
4 голосов
/ 28 июня 2011

Если вы переведете его в let:

f x = let (!a, !b) = (undefined, undefined) in x + 1

Здесь вы создаете кортеж, содержащий (a, b), и когда кортеж оценивается, оба значения a и b.1008 *

Но так как кортеж никогда не оценивается, ни a, ни b не являются.Это в основном то же самое, что и запись:

f x = let y = undefined `seq` 4 in x + 1

Поскольку y никогда не вычисляется, ни undefined.

...