Ответ 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
если вы предпочитаете, но ваш все равно.