
Alexander
15.05.2018
09:24:24
c{man=_x} - и нету линз и сета

Sergey
15.05.2018
09:24:44

Alexander
15.05.2018
09:25:10
не похоже, оно же должно знать в каком оно поле
от этого поведение меняется

Google

Sergey
15.05.2018
09:26:00
По типу в любом месте структуры траверсит

Alexander
15.05.2018
09:26:02
а man там это линза, ок
он контекст же не хранит
тут поведелие зависит от положения в структуре

Ilya
15.05.2018
09:26:29

Sergey
15.05.2018
09:26:45
Тогда, да

Alexander
15.05.2018
09:26:51
мы меняем первое поле, то в генеремом значении мы должны менять первое поле

Pavel
15.05.2018
09:27:07


A64m
15.05.2018
09:34:33
очень часто в контексте изучения хаскель слышу про вот какую-то особенную особенность ленивости в хаскеле. детали не копал особо, но лишь понимаю сам принцип, в традиционном изложении: мол до тех пор пока какой-то expression не нужен, он не будет вычислен. т.е. своего рода pull model.
из совета постижения стг-интепретатора и ленивости, что конкретно стоит изучить ? какой конкретно аспект этой ленивости ? т.к. сейчас это кажется каким-то вроде как понятным, но раз часто так упоминают, то вероятно есть что-то мудреное там.
да там нет ничего "мудреного" как такового, да, примерно как описали так и есть, надо просто привыкнуть думать о вычислениях что они именно так происходят, пограть с каким-нибудь вычислителям вроде этого
https://www.well-typed.com/blog/2017/09/visualize-cbn/
или
stgi
https://hackage.haskell.org/package/stgi
https://skillsmatter.com/skillscasts/8800-functional-and-low-level-watching-the-stg-execute


Ilya
15.05.2018
09:37:41
set мне понадобился в функции forget. Вот код:
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE RankNTypes #-}
import Control.Lens
data Crowd a = Crowd {_first :: a, _second :: a, _third :: a} deriving Show
makeLenses ''Crowd
type Man = forall a. Lens' (Crowd a) a
new :: Int -> Crowd Int -> Crowd (Crowd Int)
new x c = Crowd {_first = set first x c,
_second = set second x c,
_third = set third x c}
forget :: (Enum a, Bounded a) => Man -> Crowd a -> [Crowd a]
forget man c = [set man x c | x <- [minBound .. maxBound]]
Пример работы:
λ> forget first (Crowd True True True)
[Crowd {_first = False, _second = True, _third = True},Crowd {_first = True, _second = True, _third = True}]
Функция new более сложная, и там внутри должен использоваться forget
вот код. он работает. нужно переписать new так, чтобы она не использовала знание о внутренней структуре типа 'Crowd`. Для этого я пытаюсь использовать линзы. Есть пример одной функции, уже реализованной "как нужно" — функция forget. В таком же духе хочется переписать и new.


kana
15.05.2018
09:40:38
ну вот duplicate через generic это то что нужно
без линз даже

Google

Alexander
15.05.2018
09:41:07
мне тут подсказали context в plated линзах
может поможет


Александр
15.05.2018
09:54:32
очень часто в контексте изучения хаскель слышу про вот какую-то особенную особенность ленивости в хаскеле. детали не копал особо, но лишь понимаю сам принцип, в традиционном изложении: мол до тех пор пока какой-то expression не нужен, он не будет вычислен. т.е. своего рода pull model.
из совета постижения стг-интепретатора и ленивости, что конкретно стоит изучить ? какой конкретно аспект этой ленивости ? т.к. сейчас это кажется каким-то вроде как понятным, но раз часто так упоминают, то вероятно есть что-то мудреное там.
С ленивостью все и просто, и сложно одновременно. По началу можно ограничиться тем, что ленивость позволяет преобразовывать структуры без немедленного обхода их целиком. Напиши, например, функцию для создания графа: она принимает вершину и возвращает список смежных вершин. Одна такая функция будет полным описанием графа. Напиши теперь другую функцию, которая, используя первую, преобразует граф в список смежности. И вот пока ты работаешь с первыми элементами этого списка, он весь не вычисляется. Может, по задаче вообще не надо будет.


Dmitry
15.05.2018
10:01:27

Alexander
15.05.2018
10:01:43
а если бы меня слушали уже бы все знали !!!

Dmitry
15.05.2018
10:07:02
Это если ты не шибко математик
Но Хаскель модно и без ТК
И даже можно

Pavel
15.05.2018
10:10:11
не, не шибко. спасибо
@A64m_qb0 @graninas про ленивость понял, спасибо

Alexander
15.05.2018
11:13:27
а если я хочу что-то типа Once для определенного типа операций, то мне нужно что-то похожее делать
у меня есть AST я могу его оптимизировать, при этом optimize . optimize = optimize
хочется не перепрогонять оптимизации на поддеревьях где оно уже сделано
делать Optimized !s s/ optimized x = Optimized x (optimize x) ?

A64m
15.05.2018
11:15:23
для сжатия каких-то матрешек с исключением повторных проверок где они убраны делают же что-то вроде
Complete a | Partial (Partial a)

Alexander
15.05.2018
11:17:42
ну у меня тот же тип
а ли Partial a = Complete | Partial (Partial a) ?

A64m
15.05.2018
11:18:33
да
там параметра, конечно. два может быть

Google

A64m
15.05.2018
11:19:19
но не обязательно

kana
15.05.2018
11:19:48

Alexander
15.05.2018
11:20:24
Compete a конечно же

A64m
15.05.2018
11:20:26
Complete a

Alexander
15.05.2018
11:23:06
мне второй конструктор не нравится

kana
15.05.2018
11:24:54

Alexander
15.05.2018
11:25:04
возможно много
причем в разных местах
причем в одной точне может сразу много уровней к AST добавиться, так что нельзя делать shallow функцию для оптимизации
(но проще всего забить и вызывать 1 раз)
я сейчас так сделаю, но мне кажется это не все случаи покроет

kana
15.05.2018
11:29:08
а то не понятно, зачем все же эта рекурсия в типе

A64m
15.05.2018
11:30:52
а, забыл написать, что комитетчики приняли
https://github.com/ghc-proposals/ghc-proposals/pull/112

kana
15.05.2018
11:39:26
я думал, что в каждую ноду, тогда нужно делать аст через Fix ExprF и параморфизмы начать писать (чтобы нижние ноды видеть)

Denis
15.05.2018
11:41:04

Ilya
15.05.2018
11:46:38
да, выглядит как комонада какая-то
Похоже ты прав насчёт комонад, должны подойти. Правда, придется поменять типы, чтобы был осмысленный extract, но так даже лучше выходит.

Denis
15.05.2018
11:48:13
это уже говорит о duplicate -> Crowd (Crowd Int)
так что да, тут комонада пойдет
твой new наверное это duplicate

Google

Denis
15.05.2018
11:48:38
из комонады

kana
15.05.2018
11:49:01
ну так-то не важно, обобщать до комонады или нет
там суть в том, что нужно будет генерики использовать
чтобы по всем полям пробегаться

Denis
15.05.2018
11:49:39
или тарелки всякие)

kana
15.05.2018
11:49:50
а плейты не на генериках?

Ilya
15.05.2018
11:50:07
Опыта нет линзах:)
А комонады простые и понятные

kana
15.05.2018
11:51:16
ну типа я к тому, что сам тайпкласс и слово "комонада" ничего не решит тебе, это просто рамки, которые дадут тебе несколько фич, если ты в них влежешь
для генерации кода все равно нужны генерики, ведь ты не знаешь поля

Denis
15.05.2018
11:51:49
да думаю, если тебе надо поведения комонады, то мб лучше проанатировать свой адт косвободной?

Ilya
15.05.2018
11:53:36

Denis
15.05.2018
11:53:44

Alexander
15.05.2018
12:03:24
это ещё хитрый map по нему

Denis
15.05.2018
12:03:46
map f . duplicate = extend

Alexander
15.05.2018
12:04:14
там не map, там mapAccumulate
ты когда делаешь duplicate ты вместо n дырок делаешь одну

Google

Alexander
15.05.2018
12:05:22
как бы data Three a b c duplicate' :: Three a b c -> (Three (Three x b c) (Three a x c) (Three a b x)

Denis
15.05.2018
12:05:50
это сценалий для Cofree, я же написал, что можно аннотировать Cofree

Alexander
15.05.2018
12:06:15
наркоманы, нет бы руками написать

Denis
15.05.2018
12:06:57
зачем? если есть абстракция над обобщением всех коданных?

Alexander
15.05.2018
12:08:05
быстрее бы вышло
осбенно обидно будет если изначально алгоритм не тот
т.е. обобщать круто, когда ты сравнимое время на это тратишь, или вечером балуешься
или если там много таких структурок
не обобщающихся

Evgeny
15.05.2018
12:29:43
Привет. Пытаюсь собрать проект ghcjs + miso с помощью stack.
Возникает следующая проблема. Когда miso - единственная зависимость, указанная в dependencies в package.yaml, то всё собирается. Когда добавляю туда aeson - всё по-прежнему собирается. Но, когда в stack.yaml в extra-deps указываю конкретную версию aeson, получаю такую ошибку:
The following package identifiers were not found in your indices: ghcjs-base-0.2.0.0
В чём тут может быть дело?

A64m
15.05.2018
12:34:28
наверное в том, что он аесон не той версии, от которой гхцжс зависит?

Imants
15.05.2018
12:47:18
К вопросу о ТК и Х:
https://en.m.wikibooks.org/wiki/Haskell/Category_theory
полюбопытствуйте

Denis
15.05.2018
12:57:15
ахах
наша Ж?
https://github.com/leftaroundabout/explicit-constraint-lens/blob/master/Lens/Explicit.hs#L65

Yuriy
15.05.2018
13:04:14
ух ты
type AGetter ? ? ? ? = Ж.Optic Ж.GetterTrait ? ? ? ?

Denis
15.05.2018
13:05:00
а вообще мне не понятен этот модуль, зачем такие линзы?

Alister
15.05.2018
13:05:01
оптик ж сеттер, окаянный

Aleksey
15.05.2018
13:07:30
Жоптик какой-то
(простите)

Denis
15.05.2018
13:08:20
Ж.Optic
Ж.unto :D

Evgeny
15.05.2018
13:09:51