2015-10-12 1 views
8

Je comprends (I think) que seq Haskell, sera (en général) reduce son premier argument à WHNF, et voir ce comportement comme prévu dans GHCi:Est-ce que «évaluer» de Haskell réduit à normal ou WHNF?

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

Cependant, bien que le documentation for evaluate dit qu'il réduit également son argument à WHNF, on dirait qu'il réduit en fait pleinement son argument à la forme normale:

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

Je peux confirmer cet écart (apparent) avec

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

et

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

Si la documentation evaluate est correcte, ne devrait pas le comportement des seq et evaluate les mêmes? Qu'est-ce qui me manque ici (en tant que débutant Haskell)?

+1

Par ailleurs, il n'y a aucun moyen de polymorphiquement (sans classe de type) évaluer une valeur au-delà de WHNF. –

+0

@ReidBarton: Pouvez-vous expliquer cela un peu plus loin (ou est-ce [this] (http://stackoverflow.com/a/33070412/656912))? – orome

+2

Ce n'est pas la même chose que dans ce lien, c'est juste que sans classe de type, vous n'avez aucun moyen d'obtenir les informations sur la façon d'accéder aux sous-parties d'une valeur de type inconnu. (Hm, pas de haut niveau, de toute façon - peut-être y a-t-il une façon dangereusement dangereuse d'utiliser les données du garbage collector) –

Répondre

15

Ce que vous manquez est que GHCi aussi impressions le résultat des actions IO (si elles peuvent être affichés et ne sont pas ()), qui ne l'amener à évaluer la forme normale. Essayez plutôt:

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

Parfait! Dès que j'ai posté, je me suis posé la question, mais je suis encore assez vague sur les actions des OI et comment elles fonctionnent (surtout lorsqu'elles sont «intégrées» comme dans les interactions avec GHCi) que je n'arrive pas à comprendre. – orome