Alexander
> attempting to use module ‘AS.App.API’ (src/AS/App/API.hs) which is not loaded кто-нить такую ошибку при сборе видел?
꧁Александр
хаскиль в продакшоне! препарация какого-нибудь проекта
Вот неплохая тема - Модуль Nginx nginx-haskell-module: байндинг Haskell в Nginx
Alexander
это тех кто на fprog spb докладывается спрашивать надо, я не видел тут этих ребят
Dmitry
@confguru я послал заявку
Alexander
lyokha <alexey.radkov@gmail.com> судя по гитхабу
Dmitry
@confguru поскольку секции Haskell нет, то послал в common
꧁Александр
Да - мы там бум переделывать разделы ...
꧁Александр
https://gitter.im/ruHaskell/meetup
Чегото в gitter тишина 😊
Alexander
люби работают наверное
Alexander
выше email адрес человека на чьем гитхабе про модули nginx на haskell
꧁Александр
Спасибо
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
как такое выразить в хаскеле?
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?
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
в общем любой туториал по ним рассматривает очень близкий случай
data Op a where IntOp :: Op Int StringOp :: Op String foo :: forall a. Op a -> a foo IntOp = 1 foo StringOp = "1"
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 подключить?