Подтвердить что ты не робот

Monad m => a → [a → m a] → m a

Я новичок в Haskell, и мне интересно, есть ли лучший способ узнать, дублирует ли библиотека функциональность, чем Hoogle?

Пример: у меня есть ряд функций f :: Monad a => a -> m a, которые я хочу объединить, например

f1234 x = (return x) >>= f1 >>= f2 >>= f3 >>= f4

Но я бы предпочел написать

chain :: Monad m => a -> [a -> m a] -> m a
chain = foldl (>>=) <$> return
f1234 = (flip chain) [f1, f2, f3, f4]

Похоже, что базовая библиотека предлагает нечто эквивалентное chain?

4b9b3361

Ответ 1

Hoogle хорошо для этого и, безусловно, правильный инструмент для поиска функции с тем же типом.

Учитывая, что это просто, и оно не появляется ни в одном из обычных мест, вы можете написать его сами, как импортировать его из какого-то неясного модуля, отчасти потому, что вы не будете импортировать всю нагрузку других вещей.

(Кроме того: некоторые пакеты, похоже, не доступны для поиска из hoogle, поэтому, если вы знаете, какую функцию, имя модуля или пакета вы используете, а hoogle не знает, используйте hayoo.)

Я хотел бы подключить

(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)

из Control.Monad. Это был оператор композиции, которого я всегда ждал, пока не нашел его. Это более естественный способ работать с монадами, чем >>=, на мой взгляд.

Вы могли бы использовать его напрямую, так ясно:

f1234 = f1 >=> f2 >=> f3 >=> f4

Показывается, если вы hoogle для (a -> m a) -> (a -> m a) -> (a -> m a), поэтому будущая стратегия, если вы ищете что-то, что объединяет список чего-то, - это поиск функции, которая объединяет две функции и использует одну из функций fold.

Таким образом,

chain' :: Monad m => [a -> m a] -> a -> m a
chain' = foldr (>=>) return

f1234 = chain' [f1,f2,f3,f4]

или

chain'' :: Monad m => a -> [a -> m a] -> m a
chain'' = flip $ foldr (>=>) return

если вы предпочитаете, но ваш все равно.