Андрей
(\x -> x x) (\x -> x x) это же про безтиповое ЛИ
Зигохистоморфный
ну это да, на то оно и безтиповое ЛИ
Андрей
мб не так понял » ну хаскель тоже не может сам тип вывести
Alexander
если этой штуке явно дать тип как у fix то она будет работать как fix
Зигохистоморфный
а если надо Y в haskell то надо делать примерно так newtype Rec a = In { out :: Rec a -> a } y f = let f' = f . join out in f' $ In f'
Антон
Народ, я тут задачу на CodeWars. Условие: дан список целых чисел, нужно отсортировать нечётные, оставив чётные на месте. Я там увидел такой вариант: sortArray = replaceOdd <$> id <*> sort . filter odd where replaceOdd xs [] = xs replaceOdd (x:xs) oos@(o:os) | even x = x : replaceOdd xs oos | otherwise = o : replaceOdd xs os Извините, я это не понимаю. Скажите, что тут происходит?
Антон
И не являются ли аппликативы тут оверкиллом?
Dmitry
нечётные -- которые на нечётных местах?
Cheese
even x — (не)чётные по значению, видимо
Cheese
аппликатив тут только для кратк.
Антон
Антон
аппликатив тут только для кратк.
Ну вот для меня чересчур кратко
Cheese
перепиши без
Cheese
возьми определения из инстанса и подставь
Антон
Хорошо, попробую
Антон
Инстанс тут для списков ведь используется?
Cheese
нет
Cheese
выведи тип в уме
Cheese
или при помощи ghci
Cheese
или ещё как-нибудь
Cheese
тип sortArray
Антон
тип sortArray
Ну это-то понятно, просто [Integer] -> [Integer]
Anton
скорее Integral a => [a] -> [a]
Cheese
Ну это-то понятно, просто [Integer] -> [Integer]
приведи это к виду f a, который требует Applicative
Антон
f тут — это конструктор типа списка?
Cheese
нет
Cheese
если f ~ [], то f a ~ [a]
Cheese
а здесь f a ~ [i] -> [i]
Dmitry
Вы сейчас @441826110 мозг вынесете этими своими аппликативами
Denis
это HKT, а не аппликативы 🙂
Cheese
короче, в данном случае f <$> x <*> y — это сокращение для \a -> f (x a) (y a)
Антон
Спасибо
Cheese
а уравнение f a ~ [i] -> [i] решается так: f ~ (->) [i], a ~ [i]
Cheese
если прочитать Липовачу, становится очевидно
Антон
Антон
Впрочем, моё решение лучше — там чётность/нечётность только в одном месте упоминается 😜
Cheese
достаточно понять, что (->) можно рассматривать как конструктор типа
Mi Shа
Подскажите, а как можно получить схожий эффект от guard для Maybe в do нотации, но для Either ?
Aleksei (astynax)
Реализовать MonadPlus :)
Leonid 🦇
Проблема в том, что положить в Left при фейле
Зигохистоморфный
noMsg какой-нибудь
кана
так guard не принимает аргумента такого
Leonid 🦇
теоретически можно mempty :: Monoid m => m, но как-то сомнительно. Учитывая что <> использоваться не будет
кана
там нужна конкретна реализация Alternative (Either MyErrorType) (не MonadPlus вроде)
Leonid 🦇
Можно использовать Alt из кметта
Leonid 🦇
но тоже не катит
Leonid 🦇
empty же надо
Leonid 🦇
Можно взять Validation, он накапливает ошибки в <|> и там Monoid прокатывает
Leonid 🦇
Вместо Either
Cheese
или throwError вместо guard
Ignat
> 20!8 > Monoid
Leonid 🦇
> 20!8 > Monoid
Напиши мне инстанс Alternative для Either на Semigroup
кана
кана
там нужна конкретна реализация Alternative (Either MyErrorType) (не MonadPlus вроде)
Leonid 🦇
сорян
кана
<|> мне тут правда чет не нравится
Ignat
Напиши мне инстанс Alternative для Either на Semigroup
зачем там вообще какое-либо ограничение на левую часть)))
Leonid 🦇
эм, alternative
Leonid 🦇
и не докажешь что я редачил мессягу
Ignat
переходите на сообщения в ВК!
Ignat
там у них есть версии!
Mi Shа
там нужна конкретна реализация Alternative (Either MyErrorType) (не MonadPlus вроде)
Почему-то и empty не очень. Смысл тогда во втором конструкторе ошибки?
Leonid 🦇
переходите на сообщения в ВК!
ВК для быдла. А мы тут элита программирования. Все как один академики в башнях.
кана
тут случай именно дефолтной ошибки
Ignat
чёт преколы уровня err = nil пошли
Leonid 🦇
я бы вообще делал unless booleanExpr $ Left Something
кана
мне чет не очень понятно ограничение m () на тело в when/unless
кана
почему нельзя просто проигнорировать результат тела
Leonid 🦇
потому что игнорировать тело это еще и fmap (const ()), и это всё портит
кана
ну там красивый void есть
Leonid 🦇
была дискуссия на реддите
Leonid 🦇
ну вот пиши void
кана
when p s = if p then s else pure () => when p s = if p then void s else pure ()
Leonid 🦇
И теперь все будут платить за void
Ignat
вот в cats кайф Validated полугруппу требует