haskell 在一个monad中组合合并结果,而不做

sbtkgmzw  于 2023-11-18  发布在  其他
关注(0)|答案(2)|浏览(158)

我有一段代码,可以抽象地描述为:

foobar = do
  foo <- getFoo
  bar <- getBar
  return $ foo ++ bar

字符串
感觉一定有一种很好的方法来组合合并foobar,而不需要四行do表示法--我可以直接将一些中缀运算符应用于getFoogetBar(也许指定(++)作为组合函数,但考虑到结果是Monoid,我真的不应该......)-但我找不到这样的东西。
我搜索了Hockey的Monad m => (a -> a -> a) -> m a -> m a -> m aMonad m, Monoid a => m a -> m a -> m a,但一无所获。
是否有这样的合并功能/操作员?

w80xi6nr

w80xi6nr1#

应用性标记法相当流行:

foobar = (++) <$> getFoo <*> getBar

字符串
这自然地扩展到n元函数。表达式f <$> action1 <*> ... <*> actionN在以下假设下工作:

-- F is any applicative (including monads)
actioni :: F ti   -- for i in 1..N
f :: t1 -> t2 -> ... -> tN -> r


在这种情况下

f <$> action1 <*> ... <*> actionN :: F r

lndjwyie

lndjwyie2#

您正在搜索的函数名为liftA2
使用方法如下:

foobar = liftA2 (++) getFoo getBar

字符串

相关问题