deniok: (typed lambda)
deniok ([personal profile] deniok) wrote2015-10-01 12:29 am

Про seq

Как известно seq вычисляет свой первый аргумент до слабой заголовочной нормальной формы (WHNF). Не пользуясь GHCi, ответьте на вопрос, каково будет значение следующего выражения
Prelude> (\True y -> ()) False `seq` 5
Проверьте себя в GHCi. Какова будет полученная в первом аргументе seq WHNF?

UPD. А теперь вопрос на засыпку: каково будет значение следующего выражения
Prelude> (\True -> \y -> ()) False `seq` 5
Считаете ли вы это правильным?

[identity profile] kodt-rsdn.livejournal.com 2015-09-30 09:51 pm (UTC)(link)
Эээ, Boolean имеет вид *, а не *->*, как вообще может скомпилиться True y?

[identity profile] papa-lyosha.livejournal.com 2015-09-30 10:09 pm (UTC)(link)
(\True y -> ()) False само является WHNF, т.к. (\True y -> ()) требует двух обязательных аргументов в отличии от (\True -> \y -> ()).
Имено поэтому все патерны в одном патерн-матчинге должно иметь одинаковое количество аргументов.

[identity profile] kurilka.livejournal.com 2015-10-03 11:35 am (UTC)(link)
Интересно, что эту WHNF GHC тупо выкидывает (что логично т.к. мы её не используем):
qrilka@qdesktop ~ $ ghc -ddump-simpl seq.hs
[1 of 1] Compiling Main             ( seq.hs, seq.o )

==================== Tidy Core ====================
Result size of Tidy Core = {terms: 7, types: 6, coercions: 0}

main :: IO ()
[GblId, Str=DmdType]
main = print @ Integer GHC.Show.$fShowInteger (__integer 5)

:Main.main :: IO ()
[GblId, Str=DmdType]
:Main.main = GHC.TopHandler.runMainIO @ () main

Linking seq ...
qrilka@qdesktop ~ $ cat seq.hs
main = print $ (\True y -> ()) False `seq` 5

Или есть вариант, когда такая конструкция будет иметь смысл в реальной жизни?