Alexander
nng?
Oleg
гугл говорит https://nanomsg.github.io/nng/
Oleg
похоже на ненужно
Alexander
/has_instance Monoid (Either a)
Alexander
хм.. а почему нету?
Alexander
когда он мне так нужен
Oleg
Ну вероятно нужно Monoid a
Alexander
да хоть так, но никакого нету
Евгений
Лямбдабота подвезли?
Oleg
а ну там же можно и через Monoid a и через Monoid b empty выразить
Oleg
т.е. непонятно empty - это Right или LEft
Oleg
так что видимо, снова нютайпы
Alexander
да, логично
Alexander
но newtype-ов тоже не видно
Alexander
ладно попишу бойлерплейт
Alexander
Monoid a => f [a] -> f a это у нас что?
Alexander
f - Foldable
catostrophe
/has_instance Monoid (Either a)
Either a - дырявый
Alexander
ну и traversable
Alexander
стоп, я же не это хочу
Dmitry
как вот это вот: zipWith ($) [Char.isLetter, Char.isDigit] (repeat 'a') сделать более лучше?
Dmitry
т.е как вообще правильно строить сложные предикаты?
Alexander
(Any Char.isLetter <> Any Char.isDigit) ?
Alexander
а не
Dmitry
не
Oleg
liftA2 (&&)?
Alexander
через liftA2 можно
Oleg
а там зип
Oleg
один на первый символ, второй на второй
Oleg
attoparsec?
Alexander
да, такое парсеком наверное логичнее всего
Alexander
с Any кстати getAny $ (Any . Char.isLetter <> Any . Char.isDigit) 'a' (но к этой задаче не относится)
Dmitry
чо-т так себе тоже
Alexander
аттопарсек?
Dmitry
аттопарсер - дороже выйдет если пропихивать как предикат в Data.Text.split например
Dmitry
foldl (||) False . zipWith ($) [Char.isLetter, Char.isDigit] . repeat
Dmitry
шляпа. как-то надо лучше
Алексей
getAny . mconcat [Any . isDigit, Any . isLetter] ?
Алексей
Или надо по всем?
Alexander
не там первое к первому элементу второе ко второму
Alexander
fold . zipWith ($) [Char.isLetter, Any . isDigit]
Dmitry
а что потом делается с этим списком [Bool, Bool] ?
сворачивается чем-нибудь - and или or
Dmitry
так что может как-то можно сразу сворачивать
Dmitry
о.
Andrey
а если более сложный случай, когда надо не були получать, а например, вместе с возможными сообщениями об ошибках и агрегировать их по ходу, если они возникают?
Alexander
Validation
Andrey
у меня красиво не получалось, делал обёртку через тип валидации
Alex
Ну будет у тебя не Bool a Either
Andrey
о, монада
Ilya
ну только не and ., а and <$>
Andrey
да-да
Andrey
спасибо
Alexander
http://hackage.haskell.org/package/validation
Andrey
спасибо
Alexander
это если собирать ошибки и все сразу и т.п.
Andrey
а то с точки зрения юзера как-то дико, когда неизвестно наперед обо что и сколько раз ещё спотыкаться..
Alexander
ну если только у тебя аппликативное поведение
Alexander
с монадическим ничего не сделать, придется спотыкатьс много раз
Andrey
sequence вроде поможет, хотя чего гадать, посмотрю на пакет
Alexander
не поможет, если у тебя поведение зависит от значения из предыдещего шага, а у тебя его нету то ты ничего не сделаешь
Ilya
а нафига в Data.Traversable два sequence, кстати? sequenceA :: Applicative f => t (f a) -> f (t a) sequence :: Monad m => t (m a) -> m (t a)
Ilya
для легаси кода, где Monad не требует Applicative?
Alexander
исторически
Alexander
а как наиболее красиво сделать: zipWith f x (tail x)?
Антон
uncurry (zipWith f) . (&&&) id tail
Alexander
ap (zipWith f) tail уж лучше так
Антон
ap (zipWith f) tail уж лучше так
Ох, опять инстанс монады для функций
Антон
И zipWith f <*> tail — правильно?
Alexander
выглядит верно
Антон
fun f = zipWith f <*> tail main = print . fun (+) $ [1..8]
Антон
[3,5,7,9,11,13,15]
Антон
Работает
Антон
Можно ещё (<*> tail) . zipWith, чтобы уж совсем бесточечно :P
Ilya
а как наиболее красиво сделать: zipWith f x (tail x)?
из всех вариантов этот (первый) самый лучший
Dmitry
A есть разница с точки зрения вычисления и сохранения x в этих вариантах?
Антон
Нет