2015-10-12 1 views
8

Я понимаю (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 быть таким же? Что мне здесь не хватает (как начинающий Хаскелл)?

+1

Кстати, нет никакого способа полиморфно (без класса типа) оценить значение за пределами WHNF. –

+0

@ReidBarton: Вы можете объяснить это немного дальше (или это [это] (http://stackoverflow.com/a/33070412/656912))? – orome

+2

Это не то же самое, что в этой ссылке, это просто без класса типа, у вас нет способа получить информацию о том, как получить доступ к подчастим значения неизвестного типа. (Hm, нет способа на высоком уровне, во всяком случае - может быть, есть какой-то ужасно небезопасный способ использования данных сборщика мусора) –

ответ

15

Что вам не хватает, что GHCi также печатает результате действий ввода-вывода (если они могут быть показаны и не ()), которые делает причиной его оценки к нормальной форме. Попробуйте вместо этого:

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

Отлично! Как только я отправил сообщение, я подумал об этом, но я все еще достаточно расплывчато в отношении действий ИО и того, как они работают (особенно, когда они «встроены», поскольку они взаимодействуют с GHCi), что я не мог полностью его подделать. – orome

 Смежные вопросы

  • Нет связанных вопросов^_^