作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在过去的几个月里,我一直在研究 Haskell,我遇到了一个我不太确定如何处理的单子(monad)的情况。
我有一个 a -> m a
类型的值第二个类型为 m (a -> a)
我需要对它们进行组合,以使第一个的结果最终作为第二个的输入并产生 m (a -> a)
如果可能的话。在过去的一天里,我一直被困在这个问题上,我并没有把头绕在它上面。我想我正在寻找像 (a -> m a) -> m (a -> a) -> m (a -> a)
这样的函数.如果它更有意义,我可以提供一个更具体的例子。
最佳答案
一般来说,你不能这样做。问题在于您的结果类型:m (a -> a)
.这是一个产生函数的单子(monad) Action ;但您的第一个输入格式为 a -> m a
,它(可能)为每个参数产生不同的一元 Action 。例如,对于 []
单子(monad)[a -> a]
是具有固定长度的函数列表,而 a -> [a]
每个参数可以有不同的长度。所以没有办法将函数类型“推”回 m
一般来说;见 What is the general case of QuickCheck's promote function?对于相关的 SO 问题。
如果 a -> m a
可以满足您的需要,然后您可以将 m (a -> a)
参数到 a -> m a
使用
\ x -> fmap ($ x) af
>=>
(或
<=<
,从您的类型中不清楚)将函数组合在一起。
关于Haskell (a -> m a) -> m (a -> a) -> m (a -> a),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36436132/
我是一名优秀的程序员,十分优秀!