LINUX.ORG.RU

История изменений

Исправление hateyoufeel, (текущая версия) :

Упс. Identity и Maybe не являются монадами.

Как это связано? У тебя в первом примере первый аргумент seq вычисляется до (<=<), аргументы которого не вычисляются из-за ленивости. Во втором примере же у тебя вычисление доходит до undefined, что мы и получаем. Если ты почитаешь про seq, там написано, что первый аргумент вычисляется до WHNF, не дальше.

В том смысле, что (\x y -> case x of True -> «AAA») и (\x -> case x of True -> \y -> «AAA») для всех аргументов возвращают одинаковые значения.

Это если не считать bottom, частным случаем которого является undefined.

Алсо, отсюда: https://wiki.haskell.org/Seq

Note that seq is the only way to force evaluation of a value with a function type (except by applying it, which is liable to cause other problems). As such, it is the only reason why Haskell programs are able to distinguish between the following two values:

undefined :: a -> b

const undefined :: a -> b

This violates the principle from lambda calculus of extensionality of functions, or eta-conversion, because f and \x -> f x are distinct functions, even though they return the same output for every input. For this reason, seq, and this distinction, is sometimes ignored e.g. when assessing the correctness of optimisation techniques or type class instances.

Исправление hateyoufeel, :

Упс. Identity и Maybe не являются монадами.

Как это связано? У тебя в первом примере первый аргумент seq вычисляется до (<=<), аргументы которого не вычисляются из-за ленивости. Во втором примере же у тебя вычисление доходит до undefined, что мы и получаем. Если ты почитаешь про seq, там написано, что первый аргумент вычисляется до WHNF, не дальше.

В том смысле, что (\x y -> case x of True -> «AAA») и (\x -> case x of True -> \y -> «AAA») для всех аргументов возвращают одинаковые значения.

Это если не считать bottom, частным случаем которого является undefined.

Исходная версия hateyoufeel, :

Упс. Identity и Maybe не являются монадами.

Как это связано? У тебя в первом примере первый аргумент seq вычисляется до (<=<), аргументы которого не вычисляются из-за ленивости. Во втором примере же у тебя вычисление доходит до undefined, что мы и получаем.

В том смысле, что (\x y -> case x of True -> «AAA») и (\x -> case x of True -> \y -> «AAA») для всех аргументов возвращают одинаковые значения.

Это если не считать bottom, частным случаем которого является undefined.