Функция "оценить"
Вот выдержка из оценочной документации: (см. http://hackage.haskell.org/packages/archive/base/4.5.0.0/doc/html/Control-Exception-Base.html)
evaluate x
это не то же самое, что
return $! x
Правильное определение
evaluate x = (return $! x) >>= return
Я не понимаю смысловой разницы между этими двумя определениями... Есть ли кто-то, кто может мне помочь? Заранее спасибо!
1 ответ
Быстрая ссылка:
Тип evaluate
является:
evaluate :: a -> IO a
seq
имеет тип a -> b -> b
, Сначала он оценивает первый аргумент, затем возвращает второй аргумент.
Оценивать следует этим трем правилам:
evaluate x `seq` y ==> y
evaluate x `catch` f ==> (return $! x) `catch` f
evaluate x >>= f ==> (return $! x) >>= f
Разница между return $! x
а также (return $! x) >>= return
становится очевидным с этим выражением:
evaluate undefined `seq` 42
По первому правилу это должно оцениваться до 42.
С return $! x
определение, приведенное выше выражение вызовет неопределенное исключение. Это имеет значение ⊥, которое не равно 42.
С (return $! x) >>= return
определение, это равно 42.
В основном, return $! x
Форма является строгой, когда вычисляется значение IO. Другая форма является строгой только тогда, когда значение IO выполняется и используемое значение (используя >>=
).
Смотрите эту ветку списка рассылки для более подробной информации.