Королевский экзамен в Зазеркалье

Jan 17, 2016 01:19

Маленький хаскеллист попал в Зазеркалье и, преодолев неисчислимые препятствия, дошел до последней горизонтали. Белая и Черная Королевы говорят, что для того, чтобы стать SPJ, ему нужно пройти «Королевский экзамен», ответив на Черный и Белый вопросы: всякий ли Functor является Rotcnuf? всякий ли Rotcnuf является Functor?

class Rotcnuf f where ( Read more... )

сборник задач и упражнений по Хаскелю

Leave a comment

Comments 9

nponeccop January 16 2016, 22:41:29 UTC
синтакс еггог же. :: пропущено

Reply

deni_ok January 16 2016, 22:44:40 UTC
Да, спасибо, сейчас поправлю.

Reply


voidex January 16 2016, 23:12:04 UTC
Видимо два раза да

Reply

sassa_nf January 16 2016, 23:22:10 UTC
ну там бы пруф предоставить. скажем, в первому понятно, а ко второму?

Reply

voidex January 17 2016, 08:00:29 UTC
Не, я ошибся, просто типы сошлись, но я вчера не подумал

Reply


sassa_nf January 16 2016, 23:28:49 UTC
1. mfap ff x = fmap ($ x) ff -- так что, первое "да"

2. mfap не предлагает гарантий сохранения алгебраической структуры, так что, fmap нельзя выразить

Reply


migmit January 17 2016, 02:43:47 UTC

newtype F a = F (a -> Void)
instance Rotcnuf F where mfap (F abv) _ = F (\b -> abv (const b))

Reply


anonymous February 7 2016, 18:43:26 UTC


{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}

class Rotcnuf f where
mfap :: f (a -> b) -> a -> f b

instance Functor f => Rotcnuf f where
mfap = flip (fmap . flip ($))

=> Любой Rotcnuf это Functor. Но не наоборот. fmap никак не выразить через mfap - у тебя есть объект типа f a, а в mfap нужно подать f (a -> b).

Reply

deni_ok February 7 2016, 22:37:16 UTC
Только ровно наоборот: любой Functor это Rotcnuf. По fmap мы, как верно замечено, можем универсально построить mfap, это и обеспечивает дефолтный инстанс Rotcnuf для любого функтора. А пример Rotcnuf'а, не являющегося функтором, migmit в предыдущем комменте привел.

Reply


Leave a comment

Up