
Denis
24.09.2018
11:41:42
и + был открытым для добавления новых

Yuriy
24.09.2018
11:41:47
какую проблему нельзя решить с помощью
type ShowEq a = (Show a, Eq a)
type ShowEqToJSON a = (ShowEq a, ToJSON a)
?

Alexander
24.09.2018
11:45:20

Google

Alexander
24.09.2018
11:45:46
можно писать (Q a, C a), ((T,Q),C)
для применения можно TF

Terminator
24.09.2018
11:52:19
@pythoncoder будет жить. Поприветствуем!

Index
24.09.2018
11:54:04

A64m
24.09.2018
11:54:49
я так и понял, потому и хайлайт в след сообщении

Index
24.09.2018
11:54:55
В общем-то, это все известно и на head.hackage давно исправлено

A64m
24.09.2018
11:56:11
ну такое пора бы уже на нормальном хекедже исправить
(я-то просто cabal new-repl --with-ghc ghc-8.6.1 --allow-newer --build-dep lens набрал)

Index
24.09.2018
11:56:38
Не знаю почему не исправили еще давно, там фикс backwards-compatible.


A64m
24.09.2018
12:00:02
я ожидал больше что на MFP что-то поломается раньше
да, как-то работает с линзами. это вам не хугл
Prelude Lens.Micro> foo :: (Int, Int) -> [Int]; foo = _
<interactive>:44:35: error:
* Found hole: _ :: (Int, Int) -> [Int]
* In the expression: _
In an equation for `foo': foo = _
* Relevant bindings include
foo :: (Int, Int) -> [Int] (bound at <interactive>:44:29)
Valid hole fits include
foo :: (Int, Int) -> [Int]
mempty :: forall a. Monoid a => a
Valid refinement hole fits include
concatMap (_ :: Int -> [Int])
where concatMap :: forall (t :: * -> *) a b.
Foldable t =>
(a -> [b]) -> t a -> [b]
uncurry (_ :: Int -> Int -> [Int])
where uncurry :: forall a b c. (a -> b -> c) -> (a, b) -> c
toListOf (_ :: Getting
(base-4.12.0.0:Data.Semigroup.Internal.Endo [Int]) (Int, Int) Int)
where toListOf :: forall a s.
Getting (base-4.12.0.0:Data.Semigroup.Internal.Endo [a]) s a
-> s -> [a]
const (_ :: [Int])
where const :: forall a b. a -> b -> a
foldMap (_ :: Int -> [Int])
where foldMap :: forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
(Some refinement hole fits suppressed; use -fmax-refinement-hole-fits=N or -fno-max-refinement-hole-fits)
Prelude Lens.Micro> foo :: (Int, Int) -> [Int]; foo = toListOf _
<interactive>:45:44: error:
* Found hole:
_ :: Getting
(base-4.12.0.0:Data.Semigroup.Internal.Endo [Int]) (Int, Int) Int
* In the first argument of `toListOf', namely `_'
In the expression: toListOf _
In an equation for `foo': foo = toListOf _
* Relevant bindings include
foo :: (Int, Int) -> [Int] (bound at <interactive>:45:29)
Valid hole fits include
both :: forall a b. Traversal (a, a) (b, b) a b
folded :: forall (f :: * -> *) a. Foldable f => SimpleFold (f a) a
traverse :: forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traversed :: forall (f :: * -> *) a b.
Traversable f =>
Traversal (f a) (f b) a b
each :: forall s t a b.
Lens.Micro.Internal.Each s t a b =>
Traversal s t a b
(Some hole fits suppressed; use -fmax-valid-hole-fits=N or -fno-max-valid-hole-fits)
Valid refinement hole fits include
to (_ :: (Int, Int) -> Int)
where to :: forall s a. (s -> a) -> SimpleGetter s a
lens (_ :: (Int, Int) -> Int)
(_ :: (Int, Int) -> Int -> (Int, Int))
where lens :: forall s a b t.
(s -> a) -> (s -> b -> t) -> Lens s t a b
folding (_ :: (Int, Int) -> [Int])
where folding :: forall (f :: * -> *) s a.
Foldable f =>
(s -> f a) -> SimpleFold s a
traverseOf (_ :: LensLike
(Data.Functor.Const.Const
(base-4.12.0.0:Data.Semigroup.Internal.Endo [Int]))
(Int, Int)
(Int, Int)
Int
Int)
where traverseOf :: forall (f :: * -> *) s t a b.
LensLike f s t a b -> (a -> f b) -> s -> f t
(%~) (_ :: ASetter
(Int, Int)
(Data.Functor.Const.Const
(base-4.12.0.0:Data.Semigroup.Internal.Endo [Int]) (Int, Int))
Int
(Data.Functor.Const.Const
(base-4.12.0.0:Data.Semigroup.Internal.Endo [Int]) Int))
where (%~) :: forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
(Some refinement hole fits suppressed; use -fmax-refinement-hole-fits=N or -fno-max-refinement-hole-fits)
третья и первая рекомендации


Alexander
24.09.2018
12:20:25
блин надо на рулоне бумаги монитор

Google

A64m
24.09.2018
12:20:42
еще бы cabal по умолчанию с доками собирал

Alexander
24.09.2018
12:20:49
тут трех-метровые потолки, есть шанс, что я смогу ошибку полностью увидеть

A64m
24.09.2018
12:21:23
я еще кое-какие ключи использовал чтоб ее подсократить

A
24.09.2018
12:23:46
о, вижу линзы в коде
поясните мне, пожалуйста, зачем они вообще?
я видел кучу примеров того, как их можно юзать и кучу примеров с крутыми финтами и тд и тп, а просто обьяснения зачем они - не видел
кажется без них можно обходиться во всех задачах

A64m
24.09.2018
12:24:28
и, конечно, ключами ее можно очень сильно увеличить, в 8.8 можно будет еще и доки там показывать

A
24.09.2018
12:25:44
ну не во всех

A64m
24.09.2018
12:29:27
смысл lens и всяких урезанных версий, вроде той что выще во всяких удобствах
в первую очередь в выполнении на практике невыполненного обещания APWE и TEoIP

Alexander
24.09.2018
12:31:19
:doc APWE
:doc TEoIP

A64m
24.09.2018
12:31:49
апликатив программинг виз эффектс, эссенс оф зе итератор паттерн

Abbath
24.09.2018
12:31:49
Напомните как сейчас лучше всего хаскель на линукс накатить?

Alexander
24.09.2018
12:32:14
nix-env -i >

A64m
24.09.2018
12:32:39
как лисперы говорили, что лучше 100 функций для одной структуры данных чем по 10 для 10 (на самом деле нет), так и в хаскельной прелюдии сделано
но в 2000-е придумали как сделать 100 функций для всех структур
(не то что на самом деле нет, но вы замучаетесь аппликативы комбинировать)
а вот линзы этот подход довели до юзабельного состояния

A
24.09.2018
12:34:05

A64m
24.09.2018
12:34:17
во вторых для того чтоб по месту выбрать как ошибки отрабатывать

Google

A
24.09.2018
12:34:30
прям в репле в реальном времени нафигачил и всё нормально сразу )

A64m
24.09.2018
12:34:39

Alexander
24.09.2018
12:35:36
а есть те, кто бы хотели нанять Tweag, но боялись т.к. представительства нету в РФ?

A
24.09.2018
12:35:54
:doc APWE
сходу так вот не загуглил, но в закладки кинул, спасибо


A64m
24.09.2018
12:38:44
(извините, если кажется, что написано для дебилов, это я для рсдн писал)
Разбираем, допустим, xml и что-то делаем с результатом:
> parseLBS "<b><a>42</a></b>" ^. root . entire . el "a" . text . to T.reverse
"24"
Тут практически на каждом этапе может вернуться Nothing: например, может не быть a или в нем текста и т.д.
Также, может вернуться несколько значений
> parseLBS "<b><a>42</a><a>24</a></b>" ^.. root . entire . el "a" . text . to T.reverse
["24","42"]
но это отдельная история
Это можно обработать всеми указанными вами способами без изменения конвейера, заменой одного оператора.
(^?) просто протягивает опциональное значение
> parseLBS "<b><a>42</a></b>" ^? root . entire . el "a" . text . to T.reverse
Just "24"
> parseLBS "<b>42</b>" ^? root . entire . el "a" . text . to T.reverse
Nothing -- нет <a>
В случае множества ответов вернется первый найденный.
(^.) попытается избавится от обертки, свернуть ее с помощью класса Monoid, в котором определена операция объединения элементов и пустой элемент. Для строк такой класс имплементирован в виде конкатенации и пустой строки соответственно:
> parseLBS "<b><a>42</a></b>" ^. root . entire . el "a" . text . to T.reverse
"24"
> parseLBS "<b>42</b>" ^. root . entire . el "a" . text . to T.reverse
"" -- известно, что возвращать в случае Nothing
Если же такое значение по умолчанию не определено (как для чисел, например, где есть разные осмысленные значения по умолчанию для разных вариантов объединения — 0 и 1) — будет ошибка компиляции.
> parseLBS "<b><a>42</a></b>" ^. root . entire . el "a" . text . to T.unpack . to read :: Int
<interactive>:13:39:
No instance for (Monoid Int) arising from a use of `entire'
Possible fix: add an instance declaration for (Monoid Int)
Мы, правда, можем сделать Monoid из чего угодно, с помощью free monoid — списка.
Для возвращения списка есть оператор (^..)
> parseLBS "<b><a>42</a></b>" ^.. root . entire . el "a" . text . to T.reverse
["24"]
> parseLBS "<b>42</b>" ^.. root . entire . el "a" . text . to T.reverse
[]
> parseLBS "<b><a>42</a><a>24</a></b>" ^.. root . entire . el "a" . text . to T.reverse
["24","42"]
Ну и мы можем развернуть результат и выбросить исключение, если разворачивать нечего с помощью оператора (^?!)
> parseLBS "<b><a>42</a></b>" ^?! root . entire . el "a" . text . to T.reverse
"24"
> parseLBS "<b>42</b>" ^?! root . entire . el "a" . text . to T.reverse
"*** Exception: (^?!): empty Fold
т.е.
1) 100 функций для всех структур (буквально, для новоопределенных траверсалы выводятся автоматически)
2) для 100 функций по 10 версий safe функций, как в пакете safe, только красиво, без дублирования кода и уродливых названий
там еще и 3 и 4 и т.д, но это главное


Abbath
24.09.2018
12:44:00

Yuriy
24.09.2018
12:44:11

Abbath
24.09.2018
12:44:53
Так вроде стек подгнил немного

A64m
24.09.2018
12:45:48
@azzaazaa речь про вот это вот
надо читать http://strictlypositive.org/Idiom.pdf
и https://www.cs.ox.ac.uk/jeremy.gibbons/publications/iterator.pdf
но это устаревший уже подход, который так и не взлетел, линзы следующая итерация, которая популярна как раз

Yuriy
24.09.2018
12:48:22

Alexander
24.09.2018
12:48:45
стек более мнее работает

A64m
24.09.2018
12:48:57
умвр
что, и бекпак работает?

Yuriy
24.09.2018
12:50:07

Google

A64m
24.09.2018
12:50:58
нет, призма же возвращает то что "не распарсилось"

Yuriy
24.09.2018
12:51:05

A64m
24.09.2018
12:51:18
т.е. можно более интересное сообще об ошибке получить
игнорирует ненайденное ^?, matching например не игнорирует

Yuriy
24.09.2018
12:52:55
интересно, надо покопать

A64m
24.09.2018
12:53:40
т.е. ^? возвращает или то что подошло к призме или Nothing
а matching Right (подошло) или Left (что призма не осилила)

Alexander
24.09.2018
12:54:39
у меня 3/4 вопросов про линзы к matching сводятся

Admin
ERROR: S client not available

Yuriy
24.09.2018
12:56:23

A64m
24.09.2018
12:57:13
да

Yuriy
24.09.2018
12:57:35
собственно, задача — локализовать ошибку

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

Yuriy
24.09.2018
12:58:47
призмы предоставляют возможность "сделать, если можно", а мне надо "если можно, сделать, а если нельзя, найти то, что помешало"

A64m
24.09.2018
12:59:27
они не ищут то, что помешало, но если помешало - возвращают все данные, которые нужны для того чтоб найти что помешало

Yuriy
24.09.2018
12:59:38

A64m
24.09.2018
12:59:44
т.е. больше чем нужно, не меньше, о чем был первоначальный вопрос
другой вариант хитрее обрабатывать то что "не распарсилось"

Google

Yuriy
24.09.2018
13:00:36
а, надо написать свою композицию, собирающую стэктрэйс?

A64m
24.09.2018
13:04:16
вроде того
одно из решений

Yuriy
24.09.2018
13:06:19
какое решение вы бы порекомендовали?

A64m
24.09.2018
13:06:39
как обычно, плевать на все
применительно к данному случаю просто сообщать больше чем нужно и никак не пытаться сократить сообщение об ошибке

Yuriy
24.09.2018
13:08:53
я не понимаю, как собрать больше информации с линзами Кметта и обычной композицией

A64m
24.09.2018
13:09:48
matching (foo . bar . baz) quux и из Left брать значение quux которое не призманулось
сообщать на чем не сработали они все

Yuriy
24.09.2018
13:10:26

A64m
24.09.2018
13:10:34
норм
с более детальным репортом ошибок я бы не стал связываться

Yuriy
24.09.2018
13:11:14
quux может быть ужасно большим документом. я хочу знать, в какой строчке из 100 000 надо поправить, чтобы решить задачу

A64m
24.09.2018
13:12:33
тогда каскадить matching-и, к примеру, они то тоже композятся

Yuriy
24.09.2018
13:12:41
ведь сообщения об ошибках нужны только для того, чтобы исправлять эти ошибки

A64m
24.09.2018
13:12:52
т.е. получится Left(Right(Right(Right blah)))

Yuriy
24.09.2018
13:13:19

A64m
24.09.2018
13:13:20
но это самый простой способ собрать стек

Alexander
24.09.2018
13:14:53
@A64m_qb0 это же мы увидим "низ" дерева, а не "верх"?