deniok: (Рыжий)
deniok ([personal profile] deniok) wrote2016-01-17 01:19 am

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

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

Помогите маленькому хаскеллисту стать SPJ.

(Anonymous) 2016-02-07 06:43 pm (UTC)(link)

{-# 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).

[identity profile] deni-ok.livejournal.com 2016-02-07 10:37 pm (UTC)(link)
Только ровно наоборот: любой Functor это Rotcnuf. По fmap мы, как верно замечено, можем универсально построить mfap, это и обеспечивает дефолтный инстанс Rotcnuf для любого функтора. А пример Rotcnuf'а, не являющегося функтором, [livejournal.com profile] migmit в предыдущем комменте привел.