Size: a a a

2021 January 29

к

кана in Haskell
Зигохистоморфный Препроморфизм
тогда сделать foldMap via First
и это тоже пройдет все элементы
источник

ЗП

Зигохистоморфный Пре... in Haskell
кана
и это тоже пройдет все элементы
тогда foldr выше по ссылке
источник

A

Andrey in Haskell
кана
и это тоже пройдет все элементы
Ну чтобы не все пройти, нужна монада
источник

к

кана in Haskell
+
источник

к

кана in Haskell
на аппликативах невозможно
источник

A

Andrey in Haskell
а теперь формально докажите :)
источник

A

Andrey in Haskell
findA :: Monad f => (a -> f Bool) -> [a] -> f (Maybe a)
findA g [] = return Nothing
findA g (x : xs) = do b <- g x
                     if b then return (Just x)
                     else findA g xs

ну типо. А можно покороче (и без do-нотации)?
источник

к

кана in Haskell
да, самое простое решение

можно еще на asum

findA :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)
findA f xs = runMaybeT (asum [[x | b <- lift (f x), b] | x <- xs])
источник

к

кана in Haskell
findA f = foldr (\x next -> f x >>= \case True -> pure (Just x); False -> next) (pure Nothing)

или

findA f = foldr (\x -> ifM (f x) (pure (Just x))) (pure Nothing)

ifM :: Monad m => m Bool -> m a -> m a -> m a
ifM cond t e = do
 cond' <- cond
 if cond' then t else e

как выше зига скинул еще
источник

ЗП

Зигохистоморфный Пре... in Haskell
кана
findA f = foldr (\x next -> f x >>= \case True -> pure (Just x); False -> next) (pure Nothing)

или

findA f = foldr (\x -> ifM (f x) (pure (Just x))) (pure Nothing)

ifM :: Monad m => m Bool -> m a -> m a -> m a
ifM cond t e = do
 cond' <- cond
 if cond' then t else e

как выше зига скинул еще
зигу кинул :D
источник

A

Andrey in Haskell
кана
findA f = foldr (\x next -> f x >>= \case True -> pure (Just x); False -> next) (pure Nothing)

или

findA f = foldr (\x -> ifM (f x) (pure (Just x))) (pure Nothing)

ifM :: Monad m => m Bool -> m a -> m a -> m a
ifM cond t e = do
 cond' <- cond
 if cond' then t else e

как выше зига скинул еще
Прикольно
источник

KV

Kirill Valyavin in Haskell
А ещё есть селективные аппликативы специально для этого
источник
2021 January 30

ЖК

Жук Короед in Haskell
кана
findA f = foldr (\x next -> f x >>= \case True -> pure (Just x); False -> next) (pure Nothing)

или

findA f = foldr (\x -> ifM (f x) (pure (Just x))) (pure Nothing)

ifM :: Monad m => m Bool -> m a -> m a -> m a
ifM cond t e = do
 cond' <- cond
 if cond' then t else e

как выше зига скинул еще
Только это уже будет findM, т.к. ifM используется, так ведь?
источник

к

кана in Haskell
findM будет, потому что там Monad констрейнт
источник

ЖК

Жук Короед in Haskell
И этот findM проходит не по всем, а пока не найдёт, так?
источник

к

кана in Haskell
так
источник

R

Roman in Haskell
кана
на аппликативах невозможно
возможно если аппликатив ленивый. ИО строгий, но легким движением unsafeInterleaveIO превращается в ленивый
источник

R

Roman in Haskell
но это конечно хак
источник

к

кана in Haskell
Roman
возможно если аппликатив ленивый. ИО строгий, но легким движением unsafeInterleaveIO превращается в ленивый
так а функтор-то любой
источник

R

Roman in Haskell
кана
так а функтор-то любой
ну если ты вместо f подсунешь unsafeInterleaveIO . f, то по идее можно написать такую реализацию, которая работает с любым аппликативом и может такое принять и быть достаточно ленивой
источник