首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哈斯克尔(a -> m a) -> m (a -> a) -> m (a -> a)

哈斯克尔(a -> m a) -> m (a -> a) -> m (a -> a)
EN

Stack Overflow用户
提问于 2016-04-05 20:12:42
回答 1查看 287关注 0票数 8

在过去的几个月里,我一直在深入Haskell,遇到了一种我不太清楚该如何处理的单簧管的情况。

我有一个a -> m a类型的值和一个m (a -> a)类型的值,我需要组合它们,以便第一个值的结果作为第二个值的输入结束,并在可能的情况下生成一个m (a -> a)。在过去的一天里,我一直被困在这件事上,我不会把我的头绕在这上面。我想我正在寻找一个像(a -> m a) -> m (a -> a) -> m (a -> a)这样的函数。如果更有意义的话,我可以提供一个更具体的例子。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

代码语言:javascript
复制
\ x -> fmap ($ x) af

并使用>=> (或者<=<,您的类型不清楚)将函数组合在一起。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36436132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档