在过去的几个月里,我一直在深入Haskell,遇到了一种我不太清楚该如何处理的单簧管的情况。
我有一个a -> m a类型的值和一个m (a -> a)类型的值,我需要组合它们,以便第一个值的结果作为第二个值的输入结束,并在可能的情况下生成一个m (a -> a)。在过去的一天里,我一直被困在这件事上,我不会把我的头绕在这上面。我想我正在寻找一个像(a -> m a) -> m (a -> a) -> m (a -> a)这样的函数。如果更有意义的话,我可以提供一个更具体的例子。
发布于 2016-04-05 20:24:49
一般情况下你不能这么做。问题在于您的结果类型:m (a -> a)。这是一个单一的一元操作,它产生一个函数;但是您的第一个输入有一个表单a -> m a,它(潜在地)为每个参数生成一个不同的一元操作。例如,对于[] monad,[a -> a]是具有固定长度的函数列表,而a -> [a]对于每个参数可以有不同的长度。因此,通常无法将函数类型“推送”回m;有关这样的相关问题,请参见What is the general case of QuickCheck's promote function?。
如果a -> m a可以满足您的需要,那么您可以将m (a -> a)参数转换为a -> m a
\ x -> fmap ($ x) af并使用>=> (或者<=<,您的类型不清楚)将函数组合在一起。
https://stackoverflow.com/questions/36436132
复制相似问题