Semion
25.09.2017
20:06:07
Хммм, тут, пожалуй немного в другом фишка
Хаскелл позволяет естественным образом строить категорные конструкции
Alexander
25.09.2017
20:06:51
у нас были, но нужно во Франции быть и я не знаю требований
Semion
25.09.2017
20:06:57
Это... красиво
Google
Denis
25.09.2017
20:10:33
illiatshurotshka❄️
25.09.2017
20:11:07
жопы?
kana
25.09.2017
20:11:33
bottom
_|_
illiatshurotshka❄️
25.09.2017
20:12:11
оо крутая терминология
Alexander
25.09.2017
20:12:35
/me убил котика, извините
illiatshurotshka❄️
25.09.2017
20:13:11
стикеры запрещены?
kana
25.09.2017
20:16:08
Да, любой траверс будет линзой. Но не все функторы аппликативные
type Traversal' a b =
forall f . Applicative f =>
(b -> f b) -> (a -> f a)
он может задать только такой f, который Applicative
как следствие этот же f автоматически будет и Functor
т.е. как следствие будет подходить для любой линзы
type Lens' a b =
forall f . Functor f =>
(b -> f b) -> (a -> f a)
Google
Denis
25.09.2017
20:19:24
https://arstechnica.com/gadgets/2017/09/microsoft-quantum-toolkit/
Alexander
25.09.2017
20:20:56
@kana_sama и?
kana
25.09.2017
20:21:30
ну значит не каждая линза может быть траверсом, хоть все траверсы - линзы
Alexander
25.09.2017
20:22:13
да, я там криво сказал
ParkeT
25.09.2017
20:23:58
А как вы код форматируете в телеграме? :D
Alexander
25.09.2017
20:24:07
` <- вначале и вконце
три `
ParkeT
25.09.2017
20:24:25
Ого.
спасибо
illiatshurotshka❄️
25.09.2017
20:24:53
>не отправлять pdf с кодом созданную с lstlistings
Alexander
25.09.2017
20:25:07
@kana_sama что такое линза, это функция которая для любого f подставленного пользователем делает (b -> f b) -> (a -> f b) испольщуя только ту информацию, что f это функтор
так?
kana
25.09.2017
20:25:58
хм, ну вручную мы f не подставляем, но это делают всякие over/view за нас, правильно?
Alexander
25.09.2017
20:26:13
что такое поэтому если мы говорим пользователю, что требуем от функции больше (Applicative) у нас все продолжает работать
ParkeT
25.09.2017
20:26:32
Alexander
25.09.2017
20:26:39
ну да, очень плохой язык, но линза ничего не знает о типе f кроме того, что он функтор
@banana_is ?
kana
25.09.2017
20:27:15
там опечатка просто у тебя, он исправил
Alexander
25.09.2017
20:32:14
если твоя функция подставляет f которая Applicative, как это требует Traversable, то такая функция автоматически работает и для Lens, которому нужен только Functor
kana
25.09.2017
20:33:01
Да, это понятно, если функция может работать как траверсабл, то он может работать и как линза
Google
Yuriy
25.09.2017
20:33:33
Dmitry
25.09.2017
20:33:47
а что?
Alexander
25.09.2017
20:36:14
@jagajaga тогда уж ещё
там вопрос про стажировки
если у нас есть функция работающая как линза, то она будет работать как траверсабл
я это написал
обратное неверно!
Serghei
25.09.2017
20:37:53
мы с женой прям поржали
про _|_
kana
25.09.2017
20:38:29
черт, я же написал то же самое, что и ты в предпоследнем сообщении)
Serghei
25.09.2017
20:38:38
никогда бы в голову не пришла такая аналогия
Alexander
25.09.2017
20:38:51
@kana_sama давай что-нить попроще, type X a = forall Traversable f => a -> f a
kana
25.09.2017
20:38:53
а это один из переводов слова bottom
Alexander
25.09.2017
20:39:03
и реализация pure :: X a
Anton
25.09.2017
20:39:19
kana
25.09.2017
20:39:29
bottom ~ ass
Alexander
25.09.2017
20:39:32
и пусть есть type Y a = forall f . Functor f => a -> f a
pure не может быть типа Y a
Anton
25.09.2017
20:40:08
ну, а ascii-art _|_ вообще в приличном обществе не переведёшь
Google
Anton
25.09.2017
20:40:37
bottom - это в общем-то не ругательство
Alexander
25.09.2017
20:40:55
а теперь рассмотрим, type Z a = forall f . Functor f => f a -> f ()
kana
25.09.2017
20:41:03
стой
Alexander
25.09.2017
20:41:09
и fmap (const ()) :: Z a
стою
Arseniy
25.09.2017
20:41:14
kana
25.09.2017
20:41:59
это из-за того, что значение справа от стрелки? Потом что будь это обычное значение, то все же ок, разве нет?
и пусть есть type Y a = forall f . Functor f => a -> f a
pure не может быть типа Y a
а теперь рассмотрим, type Z a = forall f . Functor f => f a -> f ()
Alexander
25.09.2017
20:42:42
@kana_sama да из-за этого
kana
25.09.2017
20:42:43
имея некий траверсабл, мы спокойно можем отправить его туда, где нужен функтор
Alexander
25.09.2017
20:42:48
да
хочешь я полный гист сделаю
а тот посреди обсуждения жопы всякие вылезают
kana
25.09.2017
20:43:16
но имея функцию, которая отдает траверсабл, мы не можем отравить ее туда, где нужна функция, которая отдает функтор
Alexander
25.09.2017
20:44:08
я не уверен, чот отдает/ждет терминология здесь точная, но направление вроде верное
kana
25.09.2017
20:44:13
не, я сейчас сам поэксперементирую. У меня есть некоое понимание контрвариативности в плане работы функторов, но нет такого же понимания на тайплкассов
Alexander
25.09.2017
20:47:17
{-# LANGUAGE RankNTypes #-}
type X a = forall f . Applicative f => a -> f a
type Y a = forall f . Functor f => a -> f a
p :: X a
p = pure
-- q :: Y a
-- q = p -- • Could not deduce (Applicative f) arising from a use of ‘pure’
type V a = forall f . Functor f => f a -> f ()
type W a = forall f . Applicative f => f a -> f ()
v :: V a
v = fmap (const ())
w :: W a
w = v
полный код
Google
kana
25.09.2017
20:49:45
Благодарю. Пока не щелкнуло, но почему не работает мне понятно
Так, слева от стрелки у нас негативная позиция, типы там контрвариантны. Справа положительная, там все ковариантно. f a тут именно справа...
когда у нас тип
(a -> f a) -> (b -> f b)то a -> f a у нас в негативной позиции, а f a в положительной, значит f a в негативной (1 * (-1) = -1), аналогично f b в положительной. То есть у нас f сразу и в положительной позиции, и в отрицательной
Интуиция мне подсказывает, что такой случай обозначает инвариант, мы не можем ни обобщить, ни специализировать, но реальность совсем не такова
Alexander
25.09.2017
21:38:17
я ничего не понимаю (всегда путаюсь в ко и контр-вариантности), но что-то мне подсказывает, что разница в
type X f = ... vs type X = forall f. ...
и важно где тут f относительно =
@kana_sama ^
kana
25.09.2017
21:46:20
капец
Alexander
25.09.2017
22:02:32
примерно так же как и с forall x . S x vs S (forall x. x)
здесь у нас случай аналогичный S (forall x.x)
kana
25.09.2017
22:07:37
нужно попробовать это как-то нарисовать
ток сейчас понял, что юзер никакого f установить не может, нам же важен факт того, что этот тип работает для любых f
type Traversal' a b =
forall f . Applicative f =>
(b -> f b) -> (a -> f a)
type Lens' a b =
forall f . Functor f =>
(b -> f b) -> (a -> f a)
Alexander
25.09.2017
22:37:03
что ты понимаешь под юзер?
caller может
caller собственно это и делает подставляет Const и Identity
а линза работает для всех
kana
25.09.2017
22:46:04
так, caller это кто в нашем случае?
view/over/...?