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.

[identity profile] nponeccop.livejournal.com 2016-01-16 10:41 pm (UTC)(link)
синтакс еггог же. :: пропущено

[identity profile] voidex.livejournal.com 2016-01-16 11:12 pm (UTC)(link)
Видимо два раза да

[identity profile] sassa-nf.livejournal.com 2016-01-16 11:28 pm (UTC)(link)
1. mfap ff x = fmap ($ x) ff -- так что, первое "да"

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

[identity profile] migmit.livejournal.com 2016-01-17 02:43 am (UTC)(link)
newtype F a = F (a -> Void)
instance Rotcnuf F where mfap (F abv) _ = F (\b -> abv (const b))

(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).