LINUX.ORG.RU

Laziness WAT

 , ,


0

4

Я решил попробовать посмотреть, понимаю ли я как работает ленивость в ghci, в итоге у меня получилась следующая сессия:

Prelude> let x = (id True, id undefined)
Prelude> :sprint x
x = _
Prelude> let x = (True, id undefined)
Prelude> :sprint x
x = _
Prelude> let x = (True, undefined)
Prelude> :sprint x
x = (,) True _
Prelude> let x = (True, undefined::Int)
Prelude> :sprint x
x = (True,_)
Prelude> let x = (True, False)
Prelude> :sprint x
x = (True,False)

но я абсолютно не понимаю, почему я получаю такие результаты.. Может ли кто-нибудь помочь разобраться?

★★★★★

у меня один раз вообще получилось так

Prelude> let x = (,) undefined
Prelude> x

<interactive>:32:1:
    No instance for (Show (b0 -> (a0, b0)))
      (maybe you haven't applied enough arguments to a function?)
      arising from a use of ‘print’
    In a stmt of an interactive GHCi command: print it
Prelude> :sprint x
x = _
Prelude> let x = (True, undefined)
Prelude> :sprint x
*** Exception: Prelude.undefined
Prelude>


но повторить я не смог, дальше всё время результат такой

Prelude> let x = (True, undefined)
Prelude> :sprint x
x = (True,_)


в остальном идентично. Может особенности интерпретатора, как уже сказали..

$ ghci --version
The Glorious Glasgow Haskell Compilation System, version 7.10.3

AndreyKl ★★★★★ ()

Предположу, что ghci в качестве какой-нибудь оптимизации не делает кортеж ленивым если значения уже вычислены. А атомарные значения всегда вычислены. А undefined, не атом, а ленивое значение, при вычислении которого выбрасывается исключение. Но это только предположение.

Aswed ★★★★★ ()
Ответ на: комментарий от AndreyKl

гм, повторить удалось, но сессия - длинная. всё равно странно, одни раз оно выдаёт x = (True,_), а другой - undefined exception... вероятно интерпретатор приглючивает..

AndreyKl ★★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от Aswed

пока есть подозрение на CAS и поэтому автоматически применяется (,) к аргументам и то, что если не задавать тип, то у нас функция от неявного аргумента передающего тип, тогда часть сессии опретает смысл, но все равно для меня не до конца.

qnikst ★★★★★ ()