![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Как известно seq вычисляет свой первый аргумент до слабой заголовочной нормальной формы (WHNF). Не пользуясь GHCi, ответьте на вопрос, каково будет значение следующего выражения
Prelude> (\True y -> ()) False `seq` 5Проверьте себя в GHCi. Какова будет полученная в первом аргументе seq WHNF? UPD. А теперь вопрос на засыпку: каково будет значение следующего выражения
Prelude> (\True -> \y -> ()) False `seq` 5Считаете ли вы это правильным?
no subject
Date: 2015-09-30 09:51 pm (UTC)no subject
Date: 2015-09-30 10:04 pm (UTC)Если \P Q -> r истолковывается как \p -> \q -> patternmatching etc...,
то сзнф от частичного применения будет одноместной функцией с отложенным сопоставлением.
То есть, по сути, (\y -> (error "ничего не сопоставилось") :: ()).
no subject
Date: 2015-09-30 10:09 pm (UTC)Имено поэтому все патерны в одном патерн-матчинге должно иметь одинаковое количество аргументов.
no subject
Date: 2015-09-30 10:26 pm (UTC)https://wiki.haskell.org/Weak_head_normal_form
no subject
Date: 2015-10-01 12:08 am (UTC)Другой дело, что возможно сам такой подход неправильный. Получается, что даже если мы знаем, что f::A->B, мы вчё равно не можем сказать, будет ли (f a) WHNF или нет, не зная как f была определена.
no subject
Date: 2015-10-01 08:18 am (UTC)Если мы используем lambda abstraction, то для трансляции используется
из раздела 3.3 Haskell Report. А если function binding, то
из раздела 4.4.3.1.
no subject
Date: 2015-10-01 09:56 am (UTC)no subject
Date: 2015-10-02 05:13 pm (UTC)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 второе. Как-то мутно всё.
no subject
Date: 2015-10-02 05:35 pm (UTC)то есть
Ну может переменная y и не переименовывается, но это уж точно неважно.
no subject
Date: 2015-10-02 08:04 pm (UTC)WHNF у case будет его применение, чтобы под определение попало?
Но тогда не built-in функция будет (\y -> f x y) что ли? Что такое f x вообще (частичное применение)? Это лямбда?
WTF?
no subject
Date: 2015-10-02 08:29 pm (UTC)GHCi> (\True -> \y -> ()) False `seq` 42
*** Exception: :21:2-18: Non-exhaustive patterns in lambda
2. Я выше писал трансляцию function binding из haskell report. Любая определенная пользователем именованная функция семантически эквивалентна (ну то есть, проще говоря, превращается при трансляции в core в)
no subject
Date: 2015-10-02 08:37 pm (UTC)no subject
Date: 2015-10-02 09:56 pm (UTC)no subject
Date: 2015-10-02 11:22 pm (UTC)no subject
Date: 2015-10-03 06:53 am (UTC)no subject
Date: 2015-10-02 05:46 pm (UTC)no subject
Date: 2015-10-03 11:35 am (UTC)qrilka@qdesktop ~ $ ghc -ddump-simpl seq.hs
Или есть вариант, когда такая конструкция будет иметь смысл в реальной жизни?
no subject
Date: 2015-10-03 01:35 pm (UTC)no subject
Date: 2015-10-03 02:29 pm (UTC)ну и -O0 на результат не влияет ни в том ни в другом случае
no subject
Date: 2015-10-03 02:30 pm (UTC)