• O_o Haskell охренеть, столкнулся с типом, для которого я знаю как написать инстанс Apply (и в общем-то хочу его написать), но при этом не представляю, как написать Functor :(

Replies (24)

  • @qnikst, -XDeriveFunctor ? А что за тип?
  • @qnikst, Что такое Apply? И что за тип?
  • @ndtimofeev, Apply это applicative без pure
  • @PineappleZombie, Да вот нифига, у меня значения в контексте может быть построено только если оно удовлетворяет констрейнтам, т.е. в крайнем случае indexed functor можно, но бучи построенным я могу с ним спокойно работать как apply, т.е. писать <.> f (a->b)-> f a -> f b
  • @qnikst, А откуда ты возьмёшь констрайнт на b? Или это что-то вроде: data D a where { Pure :: Contraint a ⇒ a → D a; Ap :: D (a → b) → D a → D b }
  • @PineappleZombie, Да, очень похожая штука с конструктором forall b . Ap (F (b -> a)) (F b)
  • @qnikst, Ну и констрейнт там явный, в смысле Dict (S a)
  • @qnikst, F (Dict (S a)) т.е.
  • @qnikst, Гадание прошло успешно (:
  • @PineappleZombie, Оракульство на хацкелистах lvl up!
  • @qnikst, {-# LANGUAGE ExistentialQuantification #-}

    newtype F a = F a

    data Ap a = forall b . Ap (F (b -> a)) (F b)
    instance Functor Ap where
    fmap f (Ap (F x) y) = Ap (F (\ b -> f $ x b)) y

    Вроде элементарно. Хотя про констрейнт не понял.
  • @rkit, Там ещё один констуктор, например Typeable a=> V a, или V2 (Dict (Typeable a)) a. И fmap должен при применении функции такой словарь создавать, для любой функции (хотя на самом деле там ещё сложнее и для функций только static можно передавать)
  • @qnikst, Значит apply будет без закона, беспредельный.
  • @qnikst, Так я подумал, что где-то такой тайпкласс видел, и ведь действительно, в Machines есть Appliance именно с таким интерфейсом. Блин.. Меня кметт вроде не кусал..
  • @qnikst, вообще по построению это очень похоже на категорию, т.е.

    data F a b = ....
    type FV a = F Void b

    instance Category FV where

    в этом случае не возникает никаких дурацких семейств типов, которые попахивают хаками, но зато вылегает дурацкий type FV который в общем-то в основном и будет использоваться, что не круто.
  • @qnikst, А оно тебе надо, категория, функтор? applyClosure и довольно
  • @PineappleZombie, а хз, особо и не надо, но круто ж :)
  • @qnikst, в общем-то без этого добра сейчас делаю
  • @qnikst, хот с ним, но можно и выпилить легко, или по другому сделать, просто писать в unclosure $ closure (static (\va vb -> ...)) . value a . value b. круче ж чем, unclosure $ closure (static ...) `closureApply` value a `closureApply` value b.
  • @qnikst, сделать оператором?
  • @PineappleZombie, да одна фигня в принципе, вообще над этим думать стоит как все тесты пройдут, а я пока их ещё не доконвертировал
  • @qnikst, весь этот ТК бред кроме как выпендриваться тут не нужен (во всяком случае пока не вижу зачем), поскольку композиться оно может только между собой и нельзя бегать между категориями.
  • @qnikst, Typeable a=> V aНу вот это уже не функтор.
  • @rkit, Ну про это начиная с /0 и шла речь :)