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)?
Par ailleurs, il n'y a aucun moyen de polymorphiquement (sans classe de type) évaluer une valeur au-delà de WHNF. –
@ReidBarton: Pouvez-vous expliquer cela un peu plus loin (ou est-ce [this] (http://stackoverflow.com/a/33070412/656912))? – orome
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) –