Haskell(a - > ma) - > m(a - > a) - > m(a - > a)

Ben*_*err 8 monads haskell

我过去几个月一直在挖掘Haskell,我遇到了monad的情况,我不太清楚如何处理.

我有一个类型的值a -> m a和一个类型的第二个,m (a -> a)我需要组合它们,使得第一个的结果最终作为第二个的输入并产生一个m (a -> a)if if possible.在过去的一天里,我一直坚持这一点,而我并没有把头包裹起来.我想我正在寻找像这样的功能(a -> m a) -> m (a -> a) -> m (a -> a).如果它更有意义,我可以提供一个更具体的例子.

Jon*_*ast 13

一般来说,你不能这样做.问题是你的结果类型:m (a -> a).这是一个单一的,其产生的功能一元动作; 但是你的第一个输入有一个形式a -> m a,它(可能)为每个参数产生不同的 monadic动作.因此,例如,[]monad [a -> a]是具有固定长度的函数列表,而a -> [a]每个参数可以具有不同的长度.所以没有办法将函数类型"推"回到m一般情况下; 看看QuickCheck推广功能的一般情况是什么?对于相关的SO问题.

如果a -> m a能够满足您的需求,那么您可以将您的m (a -> a)论证转化为a -> m a使用

\ x -> fmap ($ x) af
Run Code Online (Sandbox Code Playgroud)

并使用>=>(或者<=<,从你的类型中不清楚)将这些功能组合在一起.