Как известно seq вычисляет свой первый аргумент до слабой заголовочной нормальной формы (WHNF). Не пользуясь GHCi, ответьте на вопрос, каково будет значение следующего выражения
Prelude> (\True y -> ()) False `seq` 5
Проверьте себя в GHCi. Какова будет полученная в первом аргументе seq WHNF?
UPD. А теперь вопрос на засыпку: каково будет значение
(
Read more... )
Имено поэтому все патерны в одном патерн-матчинге должно иметь одинаковое количество аргументов.
Reply
https://wiki.haskell.org/Weak_head_normal_form
Reply
Другой дело, что возможно сам такой подход неправильный. Получается, что даже если мы знаем, что f::A->B, мы вчё равно не можем сказать, будет ли (f a) WHNF или нет, не зная как f была определена.
Reply
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.
Reply
Reply
If a lambda abstraction is applied to "too few arguments", then evaluating the application just means substituting arguments for some of the lambda abstraction's variables, which always halts with the result a now unapplied lambda abstraction.
Какой именно unapplied?
(\True y -> ()) False = (\True -> \y -> ()) False или (\y -> (\True y -> ()) False y)?
Судя по запуску в GHCi второе. Как-то мутно всё.
Reply
\ p1 ... pn -> e = \ x1 ... xn -> case (x1, ... , xn) of (p1, ... , pn) -> e
то есть
(\True y -> ()) False
~> (\x1 x2 -> case (x1,x2) of (True,y) -> ()) False
~> \x2 -> case (False,x2) of (True,y) -> ()
Ну может переменная y и не переименовывается, но это уж точно неважно.
Reply
(\True -> \y -> ()) False
-> (\x1 -> case (x1) of (True) -> (\x2 -> ())) False
-> case (False) of (True) -> (\x2 -> ())
-> error
WHNF у case будет его применение, чтобы под определение попало?
Но тогда не built-in функция будет (\y -> f x y) что ли? Что такое f x вообще (частичное применение)? Это лямбда?
> let f True y = ()
> f False `seq` 5
5
> let f True = \y -> ()
> f False `seq` 5
5
> let f = \True -> \y -> ()
> f False `seq` 5
5
WTF?
Reply
GHCi> (\True -> \y -> ()) False `seq` 42
*** Exception: :21:2-18: Non-exhaustive patterns in lambda
2. Я выше писал трансляцию function binding из haskell report. Любая определенная пользователем именованная функция семантически эквивалентна (ну то есть, проще говоря, превращается при трансляции в core в)
x = \ x1 ... xk -> case (x1, ... , xk) of (p11, ... , p1k) match1
...
(pn1, ... , pnk) matchn
Reply
Reply
Reply
Reply
Reply
Reply
Leave a comment