@haskellru

Страница 1483 из 1551
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) ?

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
fast\Data\Reflection.hs:333:33: error: parse error on input `*' | 333 | (*) a b = AppT (AppT (VarT ''(*)) a) b | ^ чего ему не нравится-то?
Ему не нравится, что * это не имя, когда StarIsType включен, а потому сослаться на него вот так невозможно.

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 функций для всех структур

(не то что на самом деле нет, но вы замучаетесь аппликативы комбинировать)

а вот линзы этот подход довели до юзабельного состояния

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

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

A64m
24.09.2018
12:34:39
ну car cdr на всё же ) зачем 100 функций )
ну в смысле 100 утилит которыми разные вещи со списками делать

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
nix-env -i >
Какой пакет накатывать?

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

но это устаревший уже подход, который так и не взлетел, линзы следующая итерация, которая популярна как раз

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
что, и бекпак работает?
сколько раз я пробовал, столько раз всё выходило идеально! (0 раз)

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
а matching Right (подошло) или Left (что призма не осилила)
но если призма составлена из подпризм (и линз), matching не говорит, какая именно часть не сработала

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 это же мы увидим "низ" дерева, а не "верх"?

Страница 1483 из 1551