Я понимаю (I think), что в Haskell seq
, будет (как правило) reduce его первый аргумент WHNF, и видеть такое поведение, как ожидается, в GHCi:«Оценивает» Haskell в нормальном режиме или WHNF?
λ> let x = (trace "foo" Foo (trace "bar" Bar 100)) in seq x 0
foo
0
Однако, несмотря на то, documentation for evaluate
говорит, что он также уменьшает свой аргумент в WHNF, похоже, что он на самом деле полностью уменьшает свой аргумент к нормальной форме:
λ> let x = (trace "foo" Foo (trace "bar" Bar 100)) in evaluate x
foo
Foo bar
(Bar 100)
Я могу подтвердить это (видимую) расхождение с
λ> let y = (trace "foo" Foo (trace "bar" Bar 100))
λ> seq y 0
foo
0
λ> :sprint y
y = <Foo> _
и
λ> let z = (trace "foo" Foo (trace "bar" Bar 100))
λ> evaluate z
foo
Foo bar
(Bar 100)
λ> :sprint z
z = <Foo> (<Bar> 100)
Если документация evaluate
правильно, не поведение seq
и evaluate
быть таким же? Что мне здесь не хватает (как начинающий Хаскелл)?
Кстати, нет никакого способа полиморфно (без класса типа) оценить значение за пределами WHNF. –
@ReidBarton: Вы можете объяснить это немного дальше (или это [это] (http://stackoverflow.com/a/33070412/656912))? – orome
Это не то же самое, что в этой ссылке, это просто без класса типа, у вас нет способа получить информацию о том, как получить доступ к подчастим значения неизвестного типа. (Hm, нет способа на высоком уровне, во всяком случае - может быть, есть какой-то ужасно небезопасный способ использования данных сборщика мусора) –