@haskellru

Страница 256 из 1551
Alexandr
27.04.2017
10:44:12
Да - мы там бум переделывать разделы ...

https://gitter.im/ruHaskell/meetup
Чегото в gitter тишина ?

Alexander
27.04.2017
11:12:57
люби работают наверное

выше email адрес человека на чьем гитхабе про модули nginx на haskell

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

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?

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
в общем любой туториал по ним рассматривает очень близкий случай
data Op a where IntOp :: Op Int StringOp :: Op String foo :: forall a. Op a -> a foo IntOp = 1 foo StringOp = "1"

Спасибо :)

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 он генерит

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
но в хаскеле в GADT меньше бойлерплейта и больше свободы, думаю, что юзеры предпочтут писать их ручками
да, я вижу, что в хаскеле смысла нет потому что в скале смыта граница между тайпклассами и типами

Страница 256 из 1551