Функция "оценить"

Вот выдержка из оценочной документации: (см. 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 выполняется и используемое значение (используя >>=).

Смотрите эту ветку списка рассылки для более подробной информации.

Другие вопросы по тегам