
Alexander
17.09.2018
09:16:48
но полурешеток вроде нету

Yuriy
17.09.2018
09:17:54
раздельные есть в lattices
простую я сам изобретал

Alexander
17.09.2018
09:27:54
фигово, что нельзя простым образом добавить в base

Google

Alexander
17.09.2018
09:28:03
т.к. сложность бешено быстро растет
сложность программирования

Pineapple
17.09.2018
09:29:25
Что именно? Более вменяемые классы для чисел?

Alexander
17.09.2018
09:30:09
ага
ну вообще всю эту алгебру честную бы засунуть
у нас только vector-space и numeric-prelude как эксперименты

Pineapple
17.09.2018
09:30:47
Ну хотя бы выдрать аддитивную группу и кольцо из Num

Alexander
17.09.2018
09:31:25
может возможнен промежуточный вариант, достать все честные структуры

Pineapple
17.09.2018
09:31:35
Ну хотя бы аддитивную группу

Yuriy
17.09.2018
09:31:41
и fromInteger отделить как синтаксический костыль

Alexander
17.09.2018
09:31:46
и в transition period сделать Num зависяшим от себя
да-да-да
реально бесит

Google

Pineapple
17.09.2018
09:32:22
Всех — слишком много. Выходит по классу на операцию :( С одной стороны так и надо, с другой — морочно

Alexander
17.09.2018
09:33:20
ну т.е. будет промежуточный вариант, хочешь - используешь, не хочешь берёшь Int/Double где все есть

A64m
17.09.2018
09:33:27

Alexander
17.09.2018
09:33:47
о кметтопакет

Alexander
17.09.2018
09:36:25
Вопрос, а почему я в рамках ду нотации часто вижу pure вместо return? Экономия на символах?

A64m
17.09.2018
09:37:11
некоторые считают такой подход более принципиальнм
return - это реликт со времен, когда Monad и Applicative не были в одной иерархии

Yuriy
17.09.2018
09:40:08
у меня получилась такая иерархия
class CFoo a where foo :: TFoo
class CFoo a => CFooBar a where foobar :: TFooBar
class CFoo a => CFooBaz a where foobaz :: TFooBaz
fooViaBar :: TFooBar -> TFoo
fooViaBaz :: TFooBaz -> TFoo
data X
instance CFoo X where foo = fooViaBar
instance CFooBar X where foobar = (realImplementation)
data Y
instance CFoo Y where foo = fooViaBaz
instance CFooBaz Y where foobaz = (realImplementation)
чувствую, что-то не так, но не могу понять как правильно. что посоветуете?

Alexander
17.09.2018
09:40:50
некоторые считают что return путает людей
и.к. это не ретурн из императивных яп

Aleksey
17.09.2018
09:41:36
"pure - для аппликативных выражений, return - для do-блоков" :)

Yuriy
17.09.2018
09:41:49


Pineapple
17.09.2018
09:46:56
Нужны классы-синонимы. Тогда развесистые иерархии не страшны и можно дробить тайпкласссы. Что-то вроде
class Functor a => Applicative a = Pointed a, Apply a
class Pointed ...
class Apply ...
Можно объявлять инстансы по отдельности, а можно вместе. instance Applicative даёт инстансы Pointed и Apply, инстансы Pointed и Apply дают Applicative

Yuriy
17.09.2018
09:47:13

Pineapple
17.09.2018
09:47:29
Гранулярная иерархия становится нестрашной

Yuriy
17.09.2018
09:48:26
type Applicative a = (Functor a, Pointed a, Apply a)?

Google

Pineapple
17.09.2018
09:50:06
Да, плюс сахар для объявления инстансов
instance Applicative f where
pure = ...
(<*>) = ...
рассахаривается в
instance Pointed f where
pure = ...
instance Apply f where
(<*>) = ...

Yuriy
17.09.2018
09:50:53

Pineapple
17.09.2018
09:51:34
Это про страдания с классами.
Тредов нет
всё вперемешку

Alexander
17.09.2018
09:51:48
а ещё можно Old.Applicative
+ deriving via

Pineapple
17.09.2018
09:53:07
Просто в этом случае мы автоматически получаем инстансы для Pointed и Apply. Для всех типов, где есть Applicative

Alexander
17.09.2018
09:54:19
но с дерайвинг в другую сторону не будет

Pineapple
17.09.2018
09:55:08
А тут в обе стороны
Основная идея тут сделать возможным дробление тайпкласссов

Yuriy
17.09.2018
09:55:51
если менять язык, то можно создавать автоматические классы из функций. правда, все сразу начнут создавать мультиметоды — беззаконные классы
classy (+) :: a -> a -> a
instance (+) :: Int -> Int -> Int where ....

Pineapple
17.09.2018
09:57:11
Автоматические классы?

Yuriy
17.09.2018
09:57:44

Pineapple
17.09.2018
09:57:56
Это уже что-то нездоровое, кмк
Мои идеи дальше дробления тайпклассов не идут
В смысле уменьшения боли от дробления

Alexander
17.09.2018
10:11:11
т.е. если я в либе ввожу Pointed и Apply то я могу их автоматом получить если у меня есть type Applicative = (Pointed, Apply) ?

Google

Alexander
17.09.2018
10:11:38
и если я что-то ввожу в своей либе, то если у меня будут Pointed и Apply то я получу Applicative бесплатно?

Pineapple
17.09.2018
10:14:00
Идея в том, что в base поменяли определение Applicative, и все, кто объявил инстанс Applicative получает бесплатно инстансы Pointed и Apply. В другой стороны их можно объявлять по отдельности и необярательно оба
В общем да

Dmitry
17.09.2018
10:19:00

A64m
17.09.2018
10:20:06
Время для добавления такой фичи упущено, такой пропозал просто заболтают потому что каждый имеет по этому вопросу мнение

kana
17.09.2018
10:23:21

Dmitry
17.09.2018
10:24:27
почему в Int преобразуем поле "a", а из Int уже "b"?
В любом случае, я думаю, что должно быть что-то вроде
f :: forall r1. (HasField name r r1 ..., HasField name r1 r2 ...) => Record r -> Record r2С указанием @r1 при вызове f

kana
17.09.2018
10:32:33

Daniel
17.09.2018
10:32:40
Никто не пробовал делать авторизация через auth0 на хаскеле? Думаю рест апи сервак на хаскеле запилить, но auth0 нужен

Admin
ERROR: S client not available

kana
17.09.2018
10:32:47
f :: HasField "a" r0 r1 String Int
=> HasField "b" r1 r2 Int String
=> Record r0
-> Record r2
f = (field @"b" %~ show)
. (field @"a" %~ length)

Alexander
17.09.2018
10:32:59
auth0 == OAuth?
https://auth0.com/
или это?

kana
17.09.2018
10:33:46

Alexander
17.09.2018
10:34:22
чем auth0 отличается от стандартного OAuth?

Dmitry
17.09.2018
10:38:23

Daniel
17.09.2018
10:39:10
или это?
На который ты ссылку прислал, просто у нас много чего через него работает

kana
17.09.2018
10:39:18

Google

kana
17.09.2018
10:40:22
а auth0 - сервис

Alexander
17.09.2018
10:40:49
да, но является ли auth0 просто сервисом поддерживающим OAuth
или предоставляет какое-то дополнительное API которое нужно и используется
потому, что в первом случае нужно просто позвать нужные методы из oauth пакета, который есть с адресом сервиса
а во втором - нужно писать самому

Dmitry
17.09.2018
10:42:15
@kana_sama Думаю, в f надо добавить forall r1.. А при вызове f @R1.

kana
17.09.2018
10:44:48
вопрос мой выше был другой - я бы хотел написать семейство, которое само создаст r1 промежуточный
типа
forall r0 r2. Delta [("a", A, B), ("b", C, D)] r0 r2
===
forall r0 {r1} r2. (F "a" r0 r1 A B, F "b" r1 r2 C D)
но этого нельзя делать в семействе

Dmitry
17.09.2018
10:47:59
"этого" - это чего? forall?

kana
17.09.2018
10:48:43
да, нельзя скрыть внутри forall r1

Dmitry
17.09.2018
10:50:09
от forall здесь вроде мало толку все равно. Потом придется это "доказывать". Надо конкретно вычислять. Не для произвольных r, а для каких-то твоих обобщенных рекордов. Мне кажется так.

Yuriy
17.09.2018
10:58:05

Alexander
17.09.2018
11:01:46
ну т.е. для полноценного взаимодействия нужна либа
которую надо написать и помочь сообществу

Yuriy
17.09.2018
12:06:32

kana
17.09.2018
12:13:02
завтипы) Чет подобная тема только что возникала в блахе

Yuriy
17.09.2018
12:14:29
не пойду же я в бла за ответами по Хаскелю

Alexander
17.09.2018
12:40:45
у тебя в примере как-то типы не сходятся
или fooViaBar игнорируют параметр?