Про seq

Oct. 1st, 2015 12:29 am
deniok: (typed lambda)
[personal profile] deniok
Как известно seq вычисляет свой первый аргумент до слабой заголовочной нормальной формы (WHNF). Не пользуясь GHCi, ответьте на вопрос, каково будет значение следующего выражения
Prelude> (\True y -> ()) False `seq` 5
Проверьте себя в GHCi. Какова будет полученная в первом аргументе seq WHNF?

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

Date: 2015-10-01 12:08 am (UTC)
From: [identity profile] papa-lyosha.livejournal.com
Видимо да. Там написано, что (+) 2 - WHNF (это правда), но сказано, что это из-за того, что (+) это "build-in function". А это не так, даже если вы определите (+) сами, как \x y -> ..., то всё равно (+) 2 будет WHNF.

Другой дело, что возможно сам такой подход неправильный. Получается, что даже если мы знаем, что f::A->B, мы вчё равно не можем сказать, будет ли (f a) WHNF или нет, не зная как f была определена.

Date: 2015-10-01 08:18 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Почему не знаем. Знаем.
Prelude> let f = \True -> \y -> ()
Prelude> f False `seq` 5
5

Если мы используем lambda abstraction, то для трансляции используется
\ p1 ... pn -> e = \ x1 ... xn -> case (x1, ... , xn) of (p1, ... , pn) -> e
из раздела 3.3 Haskell Report. А если function binding, то
x = \ x1 ... xk -> case (x1, ... , xk) of (p11, ... , p1k) match1
                                          ...
                                          (pn1, ... , pnk) matchn
из раздела 4.4.3.1.

Date: 2015-10-01 09:56 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Предыдущий мой комментарий был, конечно, дурацки устроен. Это просто некоторая справка, я не разобрался какой подход вы считаете неправильным.

Profile

deniok: (Default)
deniok

February 2022

S M T W T F S
  12345
6789101112
13141516171819
20212223 242526
2728     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 8th, 2025 02:44 am
Powered by Dreamwidth Studios