2011-06-28 13 views
6

entiendo que en:patrones explosión de tupla

f x = x + 1 where !y = undefined

el significado del patrón bang es que y se va a evaluar antes de f.

parecida:

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

el significado es el mismo, w.r.t x y y.

Pero, ¿qué significan los patrones Bang en:

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

No parece causar indefinido para ser evaluados. ¿Cuándo entran en vigencia los patrones de in-tuple bang? Si la tupla del patrón está forzada? ¿Alguien puede dar un ejemplo donde (!a, !b) = (..) difiere de (a, b) = (..)?

Respuesta

9

Un patrón de explosión en la propia tupla forzará la evaluación de la tupla pero no sus elementos. Los patrones de explosión en los elementos de tupla los forzarán cada vez que se evalúe la tupla.

He aquí un ejemplo del comportamiento que difiere:

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

Si traduce a let:

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

Aquí, se crea una tupla que contiene (a, b), y cuando se evalúa la tupla, tanto a y b eres.

Pero como la tupla nunca se evalúa, ni a ni b son. Esto es básicamente lo mismo que escribir:

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

Puesto que y no se evalúa, ni es undefined.