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 подключить?