Один аппликативный функтор как вычислительный базис

Feb 09, 2012 17:44

Сперва пример. Вот такая программа на хаскеле вычисляет и выводит ответ на жизнь, вселенную и вообще:

import Control.Applicative
main = print $ answer succ 0 where
one = pure <*> (pure :: a -> b -> a)
inc = (<*>) ((<*>) <$> pure)
mul = (<*>) <$> pure
h = mul <*> inc
answer = h . h . h $ one
Аппликативный функтор характеризуется наличием ( Read more... )

haskell, fp

Leave a comment

Comments 20

kodt_rsdn February 9 2012, 12:07:51 UTC
Вместо обфускатора можно написать транслятор в унлямбду или с унлямбды. Там как раз SKI используется.

Reply

thedeemon February 9 2012, 12:23:55 UTC
да, транслятор в унлямбду - очень нужная в хозяйстве вещь! :)

Reply


sorhed February 9 2012, 12:13:05 UTC
Как нет применения? Можно было бы отлично писать зомбей на прошлом ICFPC. :)

Reply


sassa_nf January 14 2014, 09:44:06 UTC
также,

inc = S mul

а посему, h = inc inc

как же так?!

Reply

thedeemon January 14 2014, 10:25:06 UTC
>inc = S mul

С чего бы?

Reply

sassa_nf January 14 2014, 11:40:16 UTC
Удивительно, но факт! ты подставь?

inc = S (S (K S) K)
mul = S (K S) K
Я тоже как-то не мог понять, и в виде mul a b f x = a (b f) x этого не видно.

Зато раз x можно "сократить", то выходит mul a b x = a (b x) (даже больше: mul = (.)), а inc n f x = f ((n f) x) = mul f (n f) x

Полиморфизм!

Reply

thedeemon January 14 2014, 12:20:06 UTC
А вообще да, действительно.

Prelude> let h = inc inc
Prelude> (h . h . h $ one) (+1) 0
42

Хотя типы ghci выводит разные для inc и s mul.

Reply


Leave a comment

Up