deniok: (пацифик)
[personal profile] deniok
А вот подскажите, на Haskell Wiki вот тут в последнем абзаце дурь написана, да? Никакой разницы между встроенными и пользовательскими частично примененными функциями нет?
Prelude> (+) undefined `seq` 5
5
Prelude> const undefined `seq` 5
5
Prelude> (\x y -> x) undefined `seq` 5
5
Или это только в последней версии GHC?

UPD. Нет, понял, там все верно, сам дурак. Пусть висит, демонстрирует мою глупость urbi et orbi.

Date: 2015-09-30 09:06 am (UTC)
From: [identity profile] deni-ok.livejournal.com
А нет, понял, сам дурак. Пусть висит, демонстрирует мою глупость.

Date: 2015-09-30 12:16 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
а можно продемонстрировать мою глупость и таки объяснить, в чем был вопрос и о чем гласит цитируемый абзац? Я только смог понять, что "it may seem to be different" (и built-in functions идут отдельным пунктом от лямбда-абстракций), но заключение как-то напутано и мне не ясно, к какому выводу они приходят.

Date: 2015-09-30 02:22 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
(\x y -> x) undefined таки не является WHNF, в ней происходит вычисление при форсировании seq'ом, то есть она превращается при этом в \y -> undefined. Но никаких других вычислений, кроме связывания x с undefined не выполняется, потому что результат связывания спрятан за барьером лямбда абстракции, а там вычисления не происходят, так как это уже WHNF.

Мне казалось по глупости, что если что-то не находится в WHNF, то всегда можно исхитриться и вклеить в процесс редукции к WHNF расходимость.

Date: 2015-09-30 09:10 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
А вот более интересный вопрос: к какой WHNF был приведен левый операнд seq вот здесь:
Prelude> (\True y -> ()) False `seq` 5
5
Я знаю ответ, и он не противоречит цитируемому абзацу, но как задачка на понимание вопрос хорош.

Date: 2015-09-30 09:56 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
а, хороший вопрос.

наверное, получится функция наподобие (\y -> raise "Pattern mismatch")

Date: 2015-09-30 10:08 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Вот все-таки я нашел гадость:
Prelude> (\True y -> ()) False `seq` 5
5
Prelude> (\True -> (\y -> ())) False `seq` 5
*** Exception: :21:2-20: Non-exhaustive patterns in lambda
Мне кажется так не должно быть, хотя я понимаю, почему так получается.

Date: 2015-09-30 10:13 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
В ответ на ответ на вопрос: да типа того. Поскольку паттерн-матчинг транслируется в сase, то это можно записать так: \y -> case True of False -> ()

Profile

deniok: (Default)
deniok

April 2017

S M T W T F S
      1
23 45678
9101112131415
16171819202122
23242526272829
30      

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 27th, 2017 02:30 am
Powered by Dreamwidth Studios