LINUX.ORG.RU

А что говорят по этому поводу говорят суперкомпиляторы, имхо для хаскеля был какой-то, или нет?

cathode
()
Ответ на: комментарий от jtootf

>> а почему? как можно проверить что это действительно так?

Доказать ессно :))) Юнит тесты для этого случая конечно же не подойдут ;)

cathode
()
Ответ на: комментарий от jtootf

fmap :: (Functor f) => (a -> b) -> f a -> f b

Функтор f в данном контексте -- это монада (->) r, получаем (a -> b) -> (r -> a) -> (r -> b). А что это? Это композиция. Выражение уже упрощается до fix . return

Далее, return в контексте этой монады является тупым const, поэтому получаем fix . const

А чему это равно? Правильно, id.

balodja ★★★
()
Ответ на: комментарий от balodja

>> получаем (a -> b) -> (r -> a) -> (r -> b). А что это? Это композиция

С чего бы это?

Вообще-то это не доказательство, если строить его от сигнатуры. В данном случае (как и всегда) нужно проводить доказательство по индукции.

cathode
()
Ответ на: комментарий от balodja

>Функтор f в данном контексте -- это монада (->) r

вот этот момент непонятен. почему?

jtootf ★★★★★
() автор топика
Ответ на: комментарий от jtootf

А посчитать?

Прежде всего типы:

return :: Monad m => a -> m a
fix :: (b -> b) -> b
fmap :: Functor f => (c -> d) -> f c -> f d

Видим, что return, будучи вторым аргументом fmap, должен иметь тип вида f c, где f - некоторый функтор. С другой стороны, return имеет тип a -> m a - то есть, (->) a (m a). Отсюда f - это функтор (->) a (то есть, f X = a -> X), а fmap - не что иное, как композиция.

Далее, оттуда же получаем c = m a, где m - некоторая монада. Смотрим теперь на fix, имеющий тип (a -> a) -> a, и, в то же время, тип c -> d - как первый аргумент fmap. Отсюда c = a -> a и, окончательно, m a = a -> a. Значит, m - монада (->) a, и return = const. Остаётся посчитать:

(fmap fix return) x = ((.) fix const) x = (fix . const) x = fix (const x) = const x (fix (const x)) = x = id x

Получается, что fmap fix return = id.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

всё, понял. спасибо за развёрнутый ответ

jtootf ★★★★★
() автор топика
Ответ на: комментарий от balodja

>(->) r -- это банальный Reader, просто без отдельного типа. Смотрится в гугле на ура(например, http://www.alpheccar.org/en/posts/show/61 ), а так же в Control.Monad.Instances.

угу, спасибо

jtootf ★★★★★
() автор топика

Typeclassopedia:

When I asked how to do something I thought was really complicated, people started typing things like zip.ap fmap.(id &&& wtf) and the scary thing is that they worked! Anyway, I think those people must actually be robots because there’s no way anyone could come up with that in two seconds off the top of their head.

Начал читать http://www.haskell.org/sitewiki/images/8/85/TMR-Issue13.pdf надеюсь пойму топик -)

chumpa
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.