Андрей
(\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]
Антон
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
кана
кана
там нужна конкретна реализация Alternative (Either MyErrorType) (не MonadPlus вроде)
Leonid 🦇
сорян
кана
<|> мне тут правда чет не нравится
Leonid 🦇
эм, alternative
Leonid 🦇
и не докажешь что я редачил мессягу
Ignat
переходите на сообщения в ВК!
Ignat
там у них есть версии!
Mi Shа
кана
кана
тут случай именно дефолтной ошибки
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 полугруппу требует