Entry tags:
А вот кому трехпараметрических типов
К завтрашнему занятию задачку со звёздочкой сделал, а то некоторые больно умные последние 15 минут практики бьют баклуши, решив всё заданное.
Введём следующий трёхпараметрический типовый оператор, инкапсулирующий композицию однопараметрических конструкторов типов:
newtype Compose f g x = Compose {getCompose :: f (g x)}Каков кайнд этого конструктора типов? Приведите пример замкнутого типа, сконструированного с помощью Compose, и пример терма этого типа.
Определите функцию
ffmap h = getCompose . fmap h . Composeи объясните её выведенный тип. Попробуйте осуществить вызов
> ffmap (+42) $ Just [1,2,3]В чём причина ошибки?
Чтобы обеспечить работоспособность подобного вызова, сделайте тип Compose представителем класса типов Functor:
instance (Functor f, Functor g) => Functor (Compose f g) where fmap = ???Проверьте работоспособность на примерах:
> ffmap (+42) $ Just [1,2,3] Just [43,44,45] > ffmap (+42) $ [Just 1,Just 2,Nothing] [Just 43,Just 44,Nothing]
Сделайте тип Compose представителем класса типов Applicative:
instance (Applicative f, Applicative g) => Applicative (Compose f g) where pure = ??? (<*>) = ???Проверьте работоспособность на примерах:
> getCompose $ (+) <$> Compose [Just 1,Just 2] <*> Compose [Nothing,Just 40] [Nothing,Just 41,Nothing,Just 42] > getCompose $ (+) <$> Compose [Just 1,Just 2] <*> Compose [Just 30,Just 40] [Just 31,Just 41,Just 32,Just 42] > getCompose $ Compose [[(+1)],[(+2),(+3)]] <*> Compose [[10,20],[]] [[11,21],[],[12,22,13,23],[]]
no subject
no subject
no subject
так ведь?
no subject
no subject
no subject
no subject
no subject
no subject
no subject
а вы студиков "pointless" функции требуете сочинять?
no subject
они сами предпочитают. Там место оставлено перед =, чтобы фломастером на доске, куда это проектируется, образцы писать :)no subject
pure = Compose . pure . pure -- красиво
fmap = (Compose .) . (. getCompose) . fmap . fmap -- ой...
(<*>) = (Compose .) . (. getCompose) . (<*>) . ((pure (<*>)) <*>) . getCompose -- выдыхай, бобёр!
no subject
no subject
Тут забавно, что в Хаскеле навыворот требование - class Functor a => Applicative a, хотя нужно было бы наоборот, instance Applicative a => Functor a where fmap = (<*>) . pure
no subject
no subject
Хотя на самом деле можно бы вывести fmap в обратную сторону - из наличия pure и <*>. В частности, в данном случае из апликативности Compose следовала бы его функториальность (хотя и с другими ограничениями на типы f и g).
no subject
При этом идея получения Functor из Applicative становится похожей на следующую: если у нас у элементов есть обратные, давайте определим единицу как A*A^{-1}, и уже отсюда будем выводить другие её свойства :)
no subject
Про расщепление разными способами, ага, у МакБрайда и Патерсона было.