2011-06-28 3 views
6

Я понимаю, что в:кортежей модели взрыва

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)

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

ответ

9

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

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

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

Если перевести его на let:

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

Здесь можно создать кортеж, содержащий (a, b), а когда кортеж оценивается как a и b являются.

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

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

Так как у никогда не оценивается ни есть undefined.

Смежные вопросы