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)?
A proposito, non c'è assolutamente modo di polimorficare (senza una classe di tipo) un valore oltre a WHNF. –
@ReidBarton: Puoi spiegare un po 'di più (o è [questo] (http://stackoverflow.com/a/33070412/656912))? – orome
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) –