
Alexandr
27.04.2017
10:44:12
Да - мы там бум переделывать разделы ...

Alexander
27.04.2017
11:12:57
люби работают наверное
выше email адрес человека на чьем гитхабе про модули nginx на haskell

Google

Alexandr
27.04.2017
11:34:31
Спасибо

Misha
27.04.2017
20:48:20

Alexander
27.04.2017
20:49:12
у тебя чуть проще можно т.к. нету имен а только типы
но суть та же класс для поиска 1 и класс для постиска списка
с фундепом
в ghc-8.2 может и без фундепа можно

Misha
27.04.2017
20:58:22
ясно, попробую въехать в принцип
как я понимаю вот это самое принципиальное:
type family ProjectInner' s b where
ProjectInner' (s :-> a ': as) s = s :-> a
ProjectInner' ( a ': as) s = ProjectInner' as s
за исключением того, что :-> мне не нужно
а как оно работает, если список исчерпался, а требуемый s так и не нашелся?
точнее так
в этой реализации type family Project' a b берет на себя вырожденный случай
но я хочу, чтобы была ошибка компиляции, если искомого типа в списке нет

Alexander
27.04.2017
21:30:38
ошибка компиляции

Google

Alexander
27.04.2017
21:31:17
что ж там ещё может быть

Misha
27.04.2017
21:31:45
ну вроде да

Denis
28.04.2017
07:48:09
Привет! Есть ADT data Op = OpInt | OpString. Как написать функцию которая бы возвращала Int если туда передали OpInt, и String если передали OpString. В скале есть несколько вариантов это сделать. Как сделать в хаскеле?
Op -> Either Int String не предлагать :)

Alexander
28.04.2017
07:48:44
какой Int возвращала?

Denis
28.04.2017
07:49:18
хороший вопрос
пусть помимо операции будет еще два параметра у функции

Alexander
28.04.2017
07:49:58
(на самом деле вопрос как он есть выше не имеет смысла и ответ unsafeCoerce и путь сегфолт в результате)

Denis
28.04.2017
07:50:00
Int и String

Dmitry
28.04.2017
07:50:16
в общем случае же не получится, для экзистенциальных типов придется возвращать значение какого-то тайпкласса , так ведь?

Vladimir
28.04.2017
07:50:26
определить тайпкласс?

Alexander
28.04.2017
07:50:52
ок, допустим у меня скала, я пишу на скале:
somethingWithString.myFunction(OpInt)
функция возвращает мне int, у меня сегфолт
так?

Vladimir
28.04.2017
07:51:08
типа (IsOpContext o => Op -> o)

Alexander
28.04.2017
07:52:08
это с зависимыми типами толко если
т.к. результат функции зависит от значения в рантайме

Denis
28.04.2017
07:52:33
в скале я могу определить sealed trait Op[A]; case object OpInt extends Op[Int]; case object OpString extends Op[String]; и написать функцию f: Op ~> Id

Alexander
28.04.2017
07:52:40
но! даже в языке с зависимыми типами будет pair

Denis
28.04.2017
07:52:44
нужна статическая проверка

Google

Alexander
28.04.2017
07:53:03
я не вижу в варианте на скале data Op = OpInt | OpString
s/part/dependent pair/

Denis
28.04.2017
07:53:26
как такое выразить в хаскеле?

Dmitry
28.04.2017
07:54:00
в паттерн матчинге распаковать, для OpInt сделать что нужно
использовать uniplate что бы не делать это руками

Alexander
28.04.2017
07:56:07
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
28.04.2017
07:56:57
wow
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
parse error on input ‘<-’
Perhaps this statement should be within a 'do' block?

Alexander
28.04.2017
07:58:18

Denis
28.04.2017
07:58:32
да я понял )

Alexander
28.04.2017
07:59:12
там и R a который я тайпфемилей сдлетаь хотел остался,
щас в редакторе наберу

Denis
28.04.2017
08:01:13
Спасибо большое. Я совсем не настоящий сварщик, просто иногда люблю пробовать писать на хаскеле то что делал на скале .

Alexander
28.04.2017
08:03:37
{-# 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")
причем вывод типов работать должен
*Main> (r undefined 1 (T.pack "foo")) + (17 :: Int)
18
если использовать 2 типа разных то меньше экстеншенов

Google

Alexander
28.04.2017
08:07:52
хотя почему-то мне кажется, что если предположить XY проблему, и это для типизированого разбора/калькулятора/ADT то все по другому делать
но я обычно специально предполагаю, что человек хочет именно то, что он спрашивает ;)

Denis
28.04.2017
08:08:49
Спасибо, буду разбираться! :)

Alexander
28.04.2017
08:09:05
лучше расскажи задачу всю ?

Denis
28.04.2017
08:10:35
Задача заэнкодить Free алгебру так что бы она была сериализуема в и из JSON. если энкодить через функции data Op a = IntOp (Int -> a) | StringOp (String -> a) то такое уже в JSON не превратишь.
Op ~> Id конечно тут элементарно пишется

Alexander
28.04.2017
08:11:13
это тебе GADT надо, наверное

Denis
28.04.2017
08:11:34
наверное

Alexander
28.04.2017
08:11:57
в общем любой туториал по ним рассматривает очень близкий случай

Denis
28.04.2017
08:16:14
Спасибо :)

Alexander
28.04.2017
08:17:34
да, на случай с параметрами тоже расширится
вообще с этим прикольные штуки можно делать

Denis
28.04.2017
08:17:53
да понятно )
А куда копать что бы из
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
в компайл тайме

Dmitry
28.04.2017
08:23:57
в смысле? GADTs подключить?

Oleg
28.04.2017
08:24:16
видимо, какой-то TH подразумевается

Dmitry
28.04.2017
08:24:26
стоп, зачем?

Oleg
28.04.2017
08:24:43
@notxcain https://wiki.haskell.org/Template_Haskell

Google

Denis
28.04.2017
08:25:00

Oleg
28.04.2017
08:25:05
если не генерить новые типы то https://wiki.haskell.org/Generics

Denis
28.04.2017
08:25:59
Думаю все такие генерить

Oleg
28.04.2017
08:25:59
стоп, зачем?
у пацана есть либа для очень очень Free алгебр для scala на макросах, видать, на хачкель расширятся

Denis
28.04.2017
08:26:45

Alexander
28.04.2017
08:26:48
зачем там TH?

Dmitry
28.04.2017
08:26:53
+1

Alexander
28.04.2017
08:27:09
я пока пытаюсь понять условие очередного вопроса

Oleg
28.04.2017
08:27:14
зачем там TH?
Ну ему надо определить новые data на основе предыдущих

Denis
28.04.2017
08:27:24
Есть data Foo f = Foo { bar :: forall a. a -> f a, baz :: Int -> f String }

Oleg
28.04.2017
08:27:30
Т.е. базу для Free он генерит

Alexander
28.04.2017
08:27:49

Oleg
28.04.2017
08:27:59
типа даёшь ему DSL, а он для тебя генерит data для Free под этот DSL

Denis
28.04.2017
08:28:18
нужно во время компиляции вывести тип
data FooOp a where
Bar :: a -> FooOp a
Baz :: Int -> FooOp String
и две функции
to :: Foo f -> (FooOp ~> f)
from :: (FooOp ~> f) -> Foo f
поправил опечатку

Alexander
28.04.2017
08:30:08
FooOp ~> f что значит?
f :: * -> *

Denis
28.04.2017
08:30:26
forall a. FooOp a -> f a
натуральная трансформация, морфизм в категории эндофункторов.

Oleg
28.04.2017
08:31:32
но в хаскеле в GADT меньше бойлерплейта и больше свободы, думаю, что юзеры предпочтут писать их ручками

Denis
28.04.2017
08:32:27