Alexander
да пусть сидит
Dmitry
я, кстати, не уверен, что бан юзера приводит к его исключению из группы )
Danil
приводит
A64m
fast\Data\Reflection.hs:333:33: error: parse error on input `*'
|
333 | (*) a b = AppT (AppT (VarT ''(*)) a) b
| ^
чего ему не нравится-то?
Cheese
TypeOperators?
Cheese
или '(*)?
A64m
@int_index виноват, наверное
A64m
похоже на то
{-# LANGUAGE CPP #-}
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PatternGuards #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeOperators #-}
Aleksei (astynax)
{-# LANGUAGE IntIndexCompatible #-} (прости, Влад!)
Зигохистоморфный
привет!
как можно сделать open union of constraints?
хочу чтобы вместо (Show a, Eq a, ...) можно писать просто Show + Eq + ...
Зигохистоморфный
и + был открытым для добавления новых
Cheese
Cheese
какую проблему нельзя решить с помощью
type ShowEq a = (Show a, Eq a)
type ShowEqToJSON a = (ShowEq a, ToJSON a)
?
Alexander
Alexander
можно писать (Q a, C a), ((T,Q),C)
Alexander
для применения можно TF
Anonymous
@pythoncoder будет жить. Поприветствуем!
Vladislav
A64m
я так и понял, потому и хайлайт в след сообщении
Vladislav
В общем-то, это все известно и на head.hackage давно исправлено
A64m
ну такое пора бы уже на нормальном хекедже исправить
A64m
(я-то просто cabal new-repl --with-ghc ghc-8.6.1 --allow-newer --build-dep lens набрал)
Vladislav
Не знаю почему не исправили еще давно, там фикс backwards-compatible.
A64m
я ожидал больше что на MFP что-то поломается раньше
A64m
да, как-то работает с линзами. это вам не хугл
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)
A64m
третья и первая рекомендации
Alexander
блин надо на рулоне бумаги монитор
A64m
еще бы cabal по умолчанию с доками собирал
Alexander
тут трех-метровые потолки, есть шанс, что я смогу ошибку полностью увидеть
A64m
я еще кое-какие ключи использовал чтоб ее подсократить
Андрей
о, вижу линзы в коде
поясните мне, пожалуйста, зачем они вообще?
я видел кучу примеров того, как их можно юзать и кучу примеров с крутыми финтами и тд и тп, а просто обьяснения зачем они - не видел
кажется без них можно обходиться во всех задачах
A64m
и, конечно, ключами ее можно очень сильно увеличить, в 8.8 можно будет еще и доки там показывать
A64m
Андрей
ну не во всех
A64m
смысл lens и всяких урезанных версий, вроде той что выще во всяких удобствах
A64m
в первую очередь в выполнении на практике невыполненного обещания APWE и TEoIP
Alexander
:doc APWE
Alexander
:doc TEoIP
A64m
апликатив программинг виз эффектс, эссенс оф зе итератор паттерн
a66ath
Напомните как сейчас лучше всего хаскель на линукс накатить?
Alexander
nix-env -i >
A64m
как лисперы говорили, что лучше 100 функций для одной структуры данных чем по 10 для 10 (на самом деле нет), так и в хаскельной прелюдии сделано
A64m
но в 2000-е придумали как сделать 100 функций для всех структур
A64m
(не то что на самом деле нет, но вы замучаетесь аппликативы комбинировать)
A64m
а вот линзы этот подход довели до юзабельного состояния
Андрей
A64m
во вторых для того чтоб по месту выбрать как ошибки отрабатывать
Андрей
прям в репле в реальном времени нафигачил и всё нормально сразу )
Alexander
а есть те, кто бы хотели нанять Tweag, но боялись т.к. представительства нету в РФ?
Андрей
:doc APWE
сходу так вот не загуглил, но в закладки кинул, спасибо
A64m
(извините, если кажется, что написано для дебилов, это я для рсдн писал)
Разбираем, допустим, 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
A64m
т.е.
1) 100 функций для всех структур (буквально, для новоопределенных траверсалы выводятся автоматически)
2) для 100 функций по 10 версий safe функций, как в пакете safe, только красиво, без дублирования кода и уродливых названий
A64m
там еще и 3 и 4 и т.д, но это главное
Cheese
Cheese
a66ath
Так вроде стек подгнил немного
A64m
@azzaazaa речь про вот это вот
A64m
надо читать http://strictlypositive.org/Idiom.pdf
A64m
и https://www.cs.ox.ac.uk/jeremy.gibbons/publications/iterator.pdf
A64m
но это устаревший уже подход, который так и не взлетел, линзы следующая итерация, которая популярна как раз
Cheese
Alexander
стек более мнее работает
A64m
умвр
что, и бекпак работает?
A64m
нет, призма же возвращает то что "не распарсилось"
A64m
т.е. можно более интересное сообще об ошибке получить
A64m
игнорирует ненайденное ^?, matching например не игнорирует
Cheese
интересно, надо покопать
A64m
т.е. ^? возвращает или то что подошло к призме или Nothing
A64m
а matching Right (подошло) или Left (что призма не осилила)
Alexander
у меня 3/4 вопросов про линзы к matching сводятся
A64m
да
Cheese
собственно, задача — локализовать ошибку
A64m
ну, дело то в том что призма возвращает то с чем не справилась, так что можно ошибку локализовывать
A64m
только тогда . для композиции не получится использовать