типа функции в виде значения?
Те что-то подобное псевдокоду:
reprOf (:) = Function (Tp "a1") (Function (Tp "a2") (Tp "a2"))
@effectfully
да Prelude Data.Typeable> data A Prelude Data.Typeable> typeOf ((:) @A) A -> [ A ] -> [ A ]
можно с адскими хаками: https://github.com/effectfully/sketches/tree/master/poly-type-of-saga/part2-enumerate-type-vars (но имена я там из воздуха беру)
а тут без типопеременных
мне нужно чтобы с дженериками работало
а в вопросе не было
Дженерики хаскелёвые или то что понимают во всех остальных языках?
параметрический полиморфизм везде понимают
если функция известна статически, то можно спросить у компилятора через TH > $(lift . show =<< reify '(:)) DataConI GHC.Types.: ( ForallT [ KindedTV a_3530822107858468865 StarT ] [] ( AppT ( AppT ArrowT ( VarT a_3530822107858468865 ) ) ( AppT ( AppT ArrowT ( AppT ListT ( VarT a_3530822107858468865 ) ) ) ( AppT ListT ( VarT a_3530822107858468865 ) ) ) ) ) GHC.Types.[]
может, если вы расскажете, для чего вам это нужно, удастся найти более простое решение
Я хочу для такого типа newtype StrId a = StrId { runId :: a } написать fmap (и <*>), который будет вычислять fmap f (StrId a) = StrId (f $! a), если для переданной функции f :: a -> ... -> b, a не совпадает c b и fmap f (StrId a) = StrId (f a) в противном думал это можно c Typeable сделать, но он не работает с типопараметрами
у хаскеля очень специфичный чекер равенства на тайп-левеле, так что например сказать, являются ли a и [a] разными типами, он не сможет, если a предварительно не привести к чему-то более конкретному
Похоже, такое можно просто с тайпклассами сделать
на инстанс Functor нельзя навешивать дополнительные ограничения. скорее всего, на этом сломается
Его можно навесить на конструктор
Обсуждают сегодня