2015-10-12 8 views
8

ho capito (I think) che Haskell di seq, volontà (in genere) reduce suo primo argomento WHNF, e vedere questo comportamento come previsto in GHCi:La valutazione di Haskell si riduce a normale o WHNF?

λ> let x = (trace "foo" Foo (trace "bar" Bar 100)) in seq x 0 
foo 
0 

Tuttavia, anche se la documentation for evaluate dice che riduce anche il suo argomento a WHNF, sembra che in realtà riduce pienamente il suo argomento a forma normale:

λ> let x = (trace "foo" Foo (trace "bar" Bar 100)) in evaluate x 
foo 
Foo bar 
(Bar 100) 

posso confermare questa discrepanza (apparente) con

λ> let y = (trace "foo" Foo (trace "bar" Bar 100)) 
λ> seq y 0 
foo 
0 
λ> :sprint y 
y = <Foo> _ 

e

λ> let z = (trace "foo" Foo (trace "bar" Bar 100)) 
λ> evaluate z 
foo 
Foo bar 
(Bar 100) 
λ> :sprint z 
z = <Foo> (<Bar> 100) 

Se la documentazione per evaluate è corretta, non dovrebbe il comportamento di seq e evaluate essere lo stesso? Cosa mi manca qui (come un principiante Haskell)?

+1

A proposito, non c'è assolutamente modo di polimorficare (senza una classe di tipo) un valore oltre a WHNF. –

+0

@ReidBarton: Puoi spiegare un po 'di più (o è [questo] (http://stackoverflow.com/a/33070412/656912))? – orome

+2

Non è lo stesso di quel collegamento, è solo che senza una classe del tipo, non hai modo di ottenere le informazioni su come accedere alle sottoparti di un valore di tipo sconosciuto. (Hm, nessun modo di alto livello, comunque - forse c'è un modo orribilmente pericoloso usando i dati del garbage collector) –

risposta

15

Cosa vi manca è che GHCi anche stampe il risultato di azioni IO (se possono essere visualizzati e non sono ()), che fa causa di valutare alla forma normale. Prova invece:

λ> let x = (trace "foo" Foo (trace "bar" Bar 100)) in evaluate x >> return() 
foo 
+0

Perfetto! Non appena ho postato, mi sono interrogato su questo, ma sono ancora abbastanza vago sulle azioni IO e su come funzionano (specialmente quando sono "incorporate" così come sono nelle interazioni con GHCi) che non riesco a capire. – orome

Problemi correlati