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
какую проблему нельзя решить с помощью type ShowEq a = (Show a, Eq a) type ShowEqToJSON a = (ShowEq a, ToJSON a) ?
Alexander
можно писать (Q a, C a), ((T,Q),C)
Alexander
для применения можно TF
Anonymous
@pythoncoder будет жить. Поприветствуем!
Vladislav
fast\Data\Reflection.hs:333:33: error: parse error on input `*' | 333 | (*) a b = AppT (AppT (VarT ''(*)) a) b | ^ чего ему не нравится-то?
Ему не нравится, что * это не имя, когда StarIsType включен, а потому сослаться на него вот так невозможно.
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
смысл 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
во вторых для того чтоб по месту выбрать как ошибки отрабатывать
Андрей
прям в репле в реальном времени нафигачил и всё нормально сразу )
A64m
ну car cdr на всё же ) зачем 100 функций )
ну в смысле 100 утилит которыми разные вещи со списками делать
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 и т.д, но это главное
a66ath
nix-env -i >
Какой пакет накатывать?
a66ath
Так вроде стек подгнил немного
A64m
@azzaazaa речь про вот это вот
A64m
надо читать http://strictlypositive.org/Idiom.pdf
A64m
и https://www.cs.ox.ac.uk/jeremy.gibbons/publications/iterator.pdf
A64m
но это устаревший уже подход, который так и не взлетел, линзы следующая итерация, которая популярна как раз
Alexander
стек более мнее работает
A64m
умвр
что, и бекпак работает?
Cheese
но это устаревший уже подход, который так и не взлетел, линзы следующая итерация, которая популярна как раз
а я правильно понимаю, что линзы, точнее, призмы умеют только игнорировать ненайденную часть? есть что-нибудь такое же, но с возможностью получить в каком-то виде ошибку "в таком-то объекте не найдено такое-то поле"?
A64m
нет, призма же возвращает то что "не распарсилось"
Cheese
что, и бекпак работает?
сколько раз я пробовал, столько раз всё выходило идеально! (0 раз)
A64m
т.е. можно более интересное сообще об ошибке получить
A64m
игнорирует ненайденное ^?, matching например не игнорирует
Cheese
интересно, надо покопать
A64m
т.е. ^? возвращает или то что подошло к призме или Nothing
A64m
а matching Right (подошло) или Left (что призма не осилила)
Alexander
у меня 3/4 вопросов про линзы к matching сводятся
Cheese
а matching Right (подошло) или Left (что призма не осилила)
но если призма составлена из подпризм (и линз), matching не говорит, какая именно часть не сработала
A64m
да
Cheese
собственно, задача — локализовать ошибку
A64m
ну, дело то в том что призма возвращает то с чем не справилась, так что можно ошибку локализовывать
A64m
только тогда . для композиции не получится использовать