Size: a a a

2021 January 26

MK

Maxim Koltsov in Haskell
os.system("ghci -c ':t ...'")
источник

JS

Jerzy Syrowiecki in Haskell
Yan Shkurinskiy
Дженерики хаскелёвые или то что понимают во всех остальных языках?
параметрический полиморфизм везде понимают
источник

YS

Yan Shkurinskiy in Haskell
Jerzy Syrowiecki
параметрический полиморфизм везде понимают
Если бы (
источник

АК

Анатолий Кот... in Haskell
c типопеременными пардон*
источник

JS

Jerzy Syrowiecki in Haskell
может, с приходом завтипов можно будет превратить forall в подобие Type ->, и тогда Typeable будет работать с полиморфными функциями
источник

JS

Jerzy Syrowiecki in Haskell
Анатолий Кот
Добрый день, подскажите есть ли в хаскеле возможность получить представление типа функции в виде значения?
Те что-то подобное псевдокоду:
reprOf (:) = Function (Tp "a1") (Function (Tp "a2") (Tp "a2"))
если функция известна статически, то можно спросить у компилятора через 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.[]
источник

JS

Jerzy Syrowiecki in Haskell
Анатолий Кот
Добрый день, подскажите есть ли в хаскеле возможность получить представление типа функции в виде значения?
Те что-то подобное псевдокоду:
reprOf (:) = Function (Tp "a1") (Function (Tp "a2") (Tp "a2"))
может, если вы расскажете, для чего вам это нужно, удастся найти более простое решение
источник

АК

Анатолий Кот... in Haskell
Jerzy Syrowiecki
может, если вы расскажете, для чего вам это нужно, удастся найти более простое решение
Я хочу для такого типа
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 сделать, но он не работает с типопараметрами
источник

JS

Jerzy Syrowiecki in Haskell
а это зачем? это тоже выглядит как неправильное решение какой-то другой задачи
источник

R

Roman in Haskell
Анатолий Кот
Я хочу для такого типа
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 предварительно не привести к чему-то более конкретному
источник

R

Roman in Haskell
так что тут только нумеровать переменные как по моей ссылке вверху
источник

R

Roman in Haskell
но возможно это XY проблема
источник

R

Roman in Haskell
Roman
так что тут только нумеровать переменные как по моей ссылке вверху
ну или что-то эквивалетное, но неизбежно с инкогенертными инстансами
источник

IK

Ilya Kos in Haskell
Анатолий Кот
Я хочу для такого типа
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 сделать, но он не работает с типопараметрами
Похоже, такое можно просто с тайпклассами сделать
источник

АК

Анатолий Кот... in Haskell
Roman
так что тут только нумеровать переменные как по моей ссылке вверху
я пробовал использовать код по ссылке выше с
fmap f (StrId a) = if matchesLast (polyTypeOf f) then StrId (f a) else StrId (f $! a)

matchesLast :: PolyType -> Bool
matchesLast (Forall _ nst) = last ft == head ft
   where
         ft = flattenArrows nst
         flattenArrows ((Arrow :$ x) :$ xs) = x : flattenArrows xs
         flattenArrows last = [last]
matchesLast _ = False

но при вызове polyTypeOf f
Couldn't match type ‘b’ with ‘Polies.Var 1’
       arising from a use of ‘polyTypeOf’
     ‘b’ is a rigid type variable bound by
       the type signature for:
         fmap :: forall a b. (a -> b) -> StrId a -> StrId b

впрочем я уже понял, что так врядли получится сделать. во всяком случае с моими неглубокими познаниями в хаскеле
источник

АК

Анатолий Кот... in Haskell
Jerzy Syrowiecki
а это зачем? это тоже выглядит как неправильное решение какой-то другой задачи
скорее всего так и есть, попробую по-другому
источник

JS

Jerzy Syrowiecki in Haskell
Ilya Kos
Похоже, такое можно просто с тайпклассами сделать
на инстанс Functor нельзя навешивать дополнительные ограничения. скорее всего, на этом сломается
источник

IK

Ilya Kos in Haskell
Jerzy Syrowiecki
на инстанс Functor нельзя навешивать дополнительные ограничения. скорее всего, на этом сломается
Его можно навесить на конструктор
источник

IK

Ilya Kos in Haskell
А стоп
источник

IK

Ilya Kos in Haskell
Ну да, f же снаружи прихожит
источник