
A64m
24.10.2018
21:05:54
ну понятное дело

Alexander
24.10.2018
21:06:42
а стоп id не нужен же

A64m
24.10.2018
21:06:45
смысл несуществующей фичи в том, чтоб вычислять полную сигнатуру для coerce из известной сигнатуры для какой-то функции и указанной обертки

Alexander
24.10.2018
21:09:29
а насколько это вообще возможно

Google

Alexander
24.10.2018
21:09:57
вот возьмем $f concat [Just 1, Just 2]
я хочу чтобы это было (самое обобщенное) чем-то типа forall a b c . Num a, Coercible (Maybe a) b, Coercible b c => c`

A64m
24.10.2018
21:11:51
это плохой случай
нам надо без констрейнтов коэрсибл

Alexander
24.10.2018
21:12:35
почему, я же хочу указать откуда словарь
мне ж нужно указать что форма та же?

A64m
24.10.2018
21:12:56
как оборачивать нам известно - обертка указана, что оборачивать нам известно - параметры, ограниченные классом, для которого у обертки есть инстанс
т.е. в принципе ничего невозможного я не вижу

Alexander
24.10.2018
21:13:16
если человек напишет $f concat @First
то тут уже Coercible могут уходить
я не понимаю, где указана обёртка

A64m
24.10.2018
21:14:23
в этом и смысл фичи, если все констрейнты на коэрсибл убрать - вывод типов будет отличный

Alexander
24.10.2018
21:14:29
т.е. в моём предложении мы должны сгенерировать функцию, которой только обёртку поставить

Google

A64m
24.10.2018
21:14:42
указана как First

Alexander
24.10.2018
21:14:46
где?
@@?

A64m
24.10.2018
21:15:30
ну в идеале есть какой-то волшебный оператор
mconcat @@ First

Alexander
24.10.2018
21:15:34
т.е. concat @@First [Just 1, Just 2]

A64m
24.10.2018
21:16:01
тут и списка не надо даже и без него нужный инстанс выберется

Alexander
24.10.2018
21:16:06
мне тут не очень нравится, что мы можем в тоже самое время написать concat @@(First Mod15) [Just 1, Just 2]

A64m
24.10.2018
21:16:19
и код останется максимально полиморфным

Alexander
24.10.2018
21:16:50
почему?

A64m
24.10.2018
21:17:01
только некий стек параметризованных оберток
может это и можно оставить

Alexander
24.10.2018
21:17:38
> newtype P = P Int deriving (Eq, Ord)
> coerce (sort @ (Down P)) [1,2::Int] :: [Int]
[2,1]
сейчас я могу так сделать

A64m
24.10.2018
21:17:48
я чисто интуитивно предполагаю, что это усложнит использование гипотетической фичи

Alexander
24.10.2018
21:18:14
собственно из-за этого coercible и лезут, и нельзя написать @ (Down _)

A64m
24.10.2018
21:18:32
т.е. это именно выбор инстанса средствами указания обертки, а не более общий каст

Alexander
24.10.2018
21:19:37
я понимаю, но я теряюсь в том как это правильно сформулировать
я могу хотететь что-то (не знаю как придумать хороший пример), скажем
у меня Down Int а я хочу для него инстанс Down Sum
т.е. не внешний слой, а внутренний поменять

Google

Alexander
24.10.2018
21:21:50
текущий coerce + type application это позволяют, но очень дорогой ценой
если иметь какой-то урезанный coerce то я думаю оно практически будет работать
или я что-то упускаю

A64m
24.10.2018
21:23:47
примерно это можно и с параметризованными обертками сделать, т.е. кастануть Down a к Down (Sum a)
т.е. мы ограничиваемся только прозрачными обертками для выбора инстансов, а непрозрачные для абстракции исключаем

Alexander
24.10.2018
21:24:56
я не понимаю как это сформулировать более точным языком
т.е. скажем:
sort @@ X делает преобразование`sort :: forall a . Ord a => [a] -> [a]` :
((coerce (sort' :: [X a] -> [X a]) )::[a] -> [a])
тогда та штука будет очень полиморфной
но при этом мы не "увеличиваем" количество полиморфизма
X - что-то вроде type family (что-то вроде, но принимает то, что сохраняет структуру *->*
@A64m_qb0 я правильно понял идею?
(то что выше можно переписать просто дав нужный тип coerce да)

A64m
24.10.2018
21:31:45
ну да

Alexander
24.10.2018
21:32:43
т.е. грубо говоря в фунции forall a . ... меняем все вхождения a на X a?
где X это штука

A64m
24.10.2018
21:33:05
только байндед a
которые ограничены классом для которого у данной обертки инстанс есть

Alexander
24.10.2018
21:34:03
т.е. maximum :: forall a. [a] -> a будет:
coerce (maximum :: [X a] -> X a)) :: Ord a => [a] -> a
я так понимаю тайпчеккер ругнётся если что

A64m
24.10.2018
21:35:02
coerce (maximum :: Ord a => [X a] -> X a)) :: Ord a => [a] -> a

Google

Alexander
24.10.2018
21:35:21
лень писать внутри было
и safeMaximum :: forall a . Ord a => [a] -> Maybe a будет:
coerce (safeMaximum :: Ord a :: [X a] -> Maybe (X a)) :: [a] -> Maybe a

A64m
24.10.2018
21:37:01
т.е. для
Functor f => (a -> b) -> f a -> f b
будет
(a -> b) -> Id f a -> Id f b
неограниченные параметры никак не трогаются

Alexander
24.10.2018
21:38:00
(Id f) a ? так скобочки

A64m
24.10.2018
21:38:10
да

Alexander
24.10.2018
21:38:25
проблем с ко-контр вариантостью есть?

A64m
24.10.2018
21:38:36
хотя такой каст коэрсибл не осилит

Alexander
24.10.2018
21:38:41
типа forall a . (a -> b) -> (b -> a) -> ..
это из Maybe сделать First скажем?

A64m
24.10.2018
21:43:24
ну там-то в определении обертки все есть, так что
ничем принципиально от Down не отличается

Alexander
24.10.2018
21:45:50
let z :: forall a b . ((a->b) -> Maybe a -> Maybe b); z = coerce (fmap :: (a->b) -> First a -> First b)
да
ну т.е. достаточно техническое преобразование, которое TH (уродский синтаксис) или плагином возможно

A64m
24.10.2018
21:46:41
да

Alexander
24.10.2018
21:49:15
была бы ещё специализация в плагине, и тогда можно было бы результат возвращаемый делать полиморфным
хотя это наверное не нужно если все функции такие

kana
24.10.2018
22:12:36
я правильно понимаю, что тут пытается придуматься нормальный синтаксис для именованный инстансов на основе ньютайпов?

Alexander
24.10.2018
22:14:44
выбор инстанса для функции

A64m
24.10.2018
22:20:01

Google

A64m
24.10.2018
22:20:34
синтаксис-то пока особо не обсуждается

Alexander
24.10.2018
22:25:00
чтобы из:
liftA2 @@ZipList (+) [1,2,3] [4,5,6]
получалось:
> let f ::forall a b c. (a->b->c) -> [a] -> [b] -> [c] ; f g = coerce (liftA2 g :: ZipList a -> ZipList b -> ZipList c)
> f (+) [1,2,3] [4,5,6]
[5,7,9]
но синтаксис не важен, важно преобразование
и какими средствами его можно сделать
@A64m_qb0 а что делать с (+) <$> [1,2,3] <*> [4,5,6]
> let f ::forall a b c. (a->b->c) -> [a] -> [b] -> [c] ; f = coerce (liftA2 :: (a->b->c) -> ZipList a -> ZipList b -> ZipList c)
вот так точнее согласно тому, что обсуждали

kana
25.10.2018
00:27:36
class HasMethod c m t | c m -> t where
method :: c => t
instance HasMethod (Monoid a) "mempty" a where
method = mempty
-- instance HasMethod (Monoid a) "mappend" (a -> a -> a)
(@@) :: (Coercible t1 t2, HasMethod c1 m t1, HasMethod c2 m t2) => t1 -> (t1 -> t2) -> m2
x @@ w = undefined
x :: String
x = method @(Monoid String) @"mempty"

Terminator
25.10.2018
10:12:14
@alexandra_rosenthal будет жить. Поприветствуем!

Александра
25.10.2018
10:12:20
добрый день, ребята помогите пожалуйста
кто может взяться за ручную интеграцию према платежей в конструктор?
прием платежей qiwi wallet
конструктор insales
вся документация есть
плачу 5000

kana
25.10.2018
10:14:39
на хаскеле?

Александра
25.10.2018
10:16:02
?

Oleg
25.10.2018
10:16:16

Yuriy
25.10.2018
10:16:17
это чат о Хаскеле