Alexander 
    
    
        
        
        
        >     attempting to use module ‘AS.App.API’ (src/AS/App/API.hs) which is not loaded
        
        кто-нить такую ошибку при сборе видел?
    
 
    
    Alexander 
    
    
        
        
        
        это тех кто на fprog spb докладывается спрашивать надо, я не видел тут этих ребят
    
 
    
    Dmitry 
    
    
        
        
        
        @confguru  я послал заявку
    
 
    
    Alexander 
    
    
        
        
        
        lyokha <alexey.radkov@gmail.com> судя по гитхабу
    
 
    
    Dmitry 
    
    
        
        
        
        @confguru поскольку секции Haskell нет, то послал в common
    
 
    
    ꧁Александр 
    
    
        
        
        
        Да - мы там бум переделывать разделы ...
    
 
    
    ꧁Александр 
    
    
 
    
    Alexander 
    
    
        
        
        
        люби работают наверное
    
 
    
    Alexander 
    
    
        
        
        
        выше email адрес человека на чьем гитхабе про модули nginx на haskell
    
 
    
    ꧁Александр 
    
    
        
        
        
        Спасибо
    
 
    
    Misha 
    
    
 
    
    Alexander 
    
    
        
        
        
        у тебя чуть проще можно т.к. нету имен а только типы
    
 
    
    Alexander 
    
    
        
        
        
        но суть та же класс для поиска 1 и класс для постиска списка
    
 
    
    Alexander 
    
    
        
        
        
        с фундепом
    
 
    
    Alexander 
    
    
        
        
        
        в ghc-8.2 может и без фундепа можно
    
 
    
    Misha 
    
    
        
        
        
        ясно, попробую въехать в принцип
    
 
    
    Misha 
    
    
        
        
        
        как я понимаю вот это самое принципиальное:
        type family ProjectInner' s b where
          ProjectInner' (s :-> a ': as) s = s :-> a
          ProjectInner' (   a    ': as) s = ProjectInner' as s
        за исключением того, что :-> мне не нужно
    
 
    
    Misha 
    
    
        
        
        
        а как оно работает, если список исчерпался, а требуемый  s так и не нашелся?
    
 
    
    Misha 
    
    
        
        
        
        точнее так
    
 
    
    Misha 
    
    
        
        
        
        в этой реализации type family Project' a b берет на себя вырожденный случай
    
 
    
    Misha 
    
    
        
        
        
        но я хочу, чтобы была ошибка компиляции, если искомого типа в списке нет
    
 
    
    Alexander 
    
    
        
        
        
        ошибка компиляции
    
 
    
    Alexander 
    
    
        
        
        
        что ж там ещё может быть
    
 
    
    Misha 
    
    
        
        
        
        ну вроде да
    
 
    
    Denis 
    
    
        
        
        
        Привет! Есть ADT  data Op = OpInt | OpString. Как написать функцию которая бы возвращала Int если туда передали OpInt, и String если передали OpString. В скале есть несколько вариантов это сделать. Как сделать в хаскеле?
    
 
    
    Denis 
    
    
        
        
        
        Op -> Either Int String не предлагать :)
    
 
    
    Alexander 
    
    
        
        
        
        какой Int возвращала?
    
 
    
    Denis 
    
    
        
        
        
        хороший вопрос
    
 
    
    Denis 
    
    
        
        
        
        пусть помимо операции будет еще два параметра у функции
    
 
    
    Alexander 
    
    
        
        
        
        (на самом деле вопрос как он есть выше не имеет смысла и ответ unsafeCoerce и путь сегфолт в результате)
    
 
    
    Denis 
    
    
        
        
        
        Int и String
    
 
    
    Dmitry 
    
    
        
        
        
        в общем случае же не получится, для экзистенциальных типов придется возвращать значение какого-то тайпкласса , так ведь?
    
 
    
    Vladimir 
    
    
        
        
        
        определить тайпкласс?
    
 
    
    Alexander 
    
    
        
        
        
        ок, допустим у меня скала, я пишу на скале:
        
        somethingWithString.myFunction(OpInt)
    
 
    
    Alexander 
    
    
        
        
        
        функция возвращает мне int, у меня сегфолт
    
 
    
    Alexander 
    
    
        
        
        
        так?
    
 
    
    Vladimir 
    
    
        
        
        
        типа (IsOpContext o => Op -> o)
    
 
    
    Alexander 
    
    
        
        
        
        это с зависимыми типами толко если
    
 
    
    Alexander 
    
    
        
        
        
        т.к. результат функции зависит от значения в рантайме
    
 
    
    Denis 
    
    
        
        
        
        в скале я могу определить sealed trait Op[A]; case object OpInt extends Op[Int]; case object OpString extends Op[String]; и написать функцию f: Op ~> Id
    
 
    
    Alexander 
    
    
        
        
        
        но! даже в языке с зависимыми типами будет pair
    
 
    
    Denis 
    
    
        
        
        
        нужна статическая проверка
    
 
    
    Alexander 
    
    
        
        
        
        я не вижу в варианте на скале data Op = OpInt | OpString
    
 
    
    Alexander 
    
    
        
        
        
        s/part/dependent pair/
    
 
    
    Denis 
    
    
 
    
    Denis 
    
    
        
        
        
        как такое выразить в хаскеле?
    
 
    
    Dmitry 
    
    
        
        
        
        в паттерн матчинге распаковать, для OpInt сделать что нужно
    
 
    
    Dmitry 
    
    
        
        
        
        использовать uniplate что бы не делать это руками
    
 
    
    Alexander 
    
    
        
        
        
        data Op = OI | OS
        class K (a::Op) b | a -> b, b <- a where r :: proxy a -> Int -> String -> R a
        instance K OI Int where r _ i _ = i
        instance K OS String where r _ _ s = s
    
 
    
    Alexander 
    
    
        
        
        
        это я прямо в чятике набирал могу гист сделать
    
 
    
    Denis 
    
    
        
        
        
        wow
    
 
    
    Denis 
    
    
        
        
        
        data Op = OI | OS
        class K (a::Op) b | a -> b, b <- a where 
          r :: proxy a -> Int -> String -> R a
        instance K OI Int where r _ i _ = i
        instance K OS String where r _ _ s = s
    
 
    
    Denis 
    
    
        
        
        
        parse error on input ‘<-’
        Perhaps this statement should be within a 'do' block?
    
 
    
    Alexander 
    
    
 
    
    Denis 
    
    
        
        
        
        да я понял )
    
 
    
    Alexander 
    
    
        
        
        
        там и R a который я тайпфемилей сдлетаь хотел остался,
    
 
    
    Alexander 
    
    
        
        
        
        щас в редакторе наберу
    
 
    
    Denis 
    
    
        
        
        
        Спасибо большое. Я совсем не настоящий сварщик, просто иногда люблю пробовать писать на хаскеле то что делал на скале .
    
 
    
    Alexander 
    
    
        
        
        
        {-# LANGUAGE DataKinds #-}
        {-# LANGUAGE KindSignatures #-}
        {-# LANGUAGE MultiParamTypeClasses #-}
        {-# LANGUAGE FunctionalDependencies #-}
        {-# LANGUAGE TypeApplications #-}
        
        import Data.Text (Text)
        import Data.Proxy
        import qualified Data.Text as T
        
        data Op = OI | OS
        
        class K (a::Op) b | a -> b, b -> a where
          r :: proxy a -> Int -> Text -> b
        
        instance K OI Int where r _ i _ = i
        instance K OS Text where r _ _ s = s
        
        test1 = r (Proxy :: Proxy 'OI) 4 (T.pack "foo")
    
 
    
    Alexander 
    
    
        
        
        
        причем вывод типов работать должен
    
 
    
    Alexander 
    
    
        
        
        
        *Main> (r undefined 1 (T.pack "foo")) + (17 :: Int)
        18
    
 
    
    Alexander 
    
    
        
        
        
        если использовать 2 типа разных то меньше экстеншенов
    
 
    
    Alexander 
    
    
        
        
        
        хотя почему-то мне кажется, что если предположить XY проблему, и это для типизированого разбора/калькулятора/ADT то все по другому делать
    
 
    
    Alexander 
    
    
        
        
        
        но я обычно специально предполагаю, что человек хочет именно то, что он спрашивает ;)
    
 
    
    Denis 
    
    
        
        
        
        Спасибо, буду разбираться! :)
    
 
    
    Alexander 
    
    
        
        
        
        лучше расскажи задачу всю 😏
    
 
    
    Denis 
    
    
        
        
        
        Задача заэнкодить Free алгебру так что бы она была сериализуема в и из JSON. если энкодить через функции data Op a = IntOp (Int -> a) | StringOp (String -> a) то такое уже в  JSON не превратишь.
    
 
    
    Denis 
    
    
        
        
        
        Op ~> Id конечно тут элементарно пишется
    
 
    
    Alexander 
    
    
        
        
        
        это  тебе GADT надо, наверное
    
 
    
    Denis 
    
    
        
        
        
        наверное
    
 
    
    Alexander 
    
    
        
        
        
        в общем любой туториал по ним рассматривает очень близкий случай
    
 
    
    Denis 
    
    
        
        
        
        Спасибо :)
    
 
    
    Alexander 
    
    
        
        
        
        да, на случай с параметрами тоже расширится
    
 
    
    Alexander 
    
    
        
        
        
        вообще с этим прикольные штуки можно делать
    
 
    
    Denis 
    
    
        
        
        
        да понятно )
    
 
    
    Denis 
    
    
        
        
        
        А куда копать что бы из 
        data Foo f = Foo { bar :: forall a. a -> f a,  baz :: Int -> f String }
        получить
        data FooOp a where
          Bar :: a -> FooOp a
          Baz :: Int -> FooOp String
    
 
    
    Denis 
    
    
        
        
        
        в компайл тайме
    
 
    
    Dmitry 
    
    
        
        
        
        в смысле? GADTs подключить?