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

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

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

sassa_nf January 14 2014, 13:15:08 UTC
думаю, ещё сильно зависит от того, как mul задать. Если задать слишком строго (т.е. не сокращать x в типе), то хотя всё равно реализация mul = (.), но это будет специализация (.) для функций вида (a->b)->(c->d) и не получится использовать mul в inc, т.к. в inc используется версия mul без x (версия (.) для функций вида a->b).

Reply


Leave a comment

Up