我正在玩 Parsec,我想将两个解析器组合成一个,并将结果放在一对中,然后提供另一个函数来对解析结果进行操作以编写如下内容:

try (pFactor <&> (char '*' *> pTerm) `using` (*))

所以我写了这个:
(<&>) :: (Monad m) => m a -> m b -> m (a, b)
pa <&> pb = do
  a <- pa
  b <- pb
  return (a, b)


using :: (Functor f) => f (a, b) -> (a -> b -> c) -> f c
p `using` f = (uncurry f) <$> p

有没有类似于 () 的东西已经在某处实现了?或者这可以写成pointfree吗?我试过 fmap (,) 但似乎很难匹配类型。

最佳答案



我现在不知道它是否在任何地方实现,但 <&> 应该与 liftM2 (,) 相同。与 fmap 的不同之处在于,liftM2 将二元函数提升到 monad 中。

关于haskell - 将两个 monadic 值成对并返回,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7541438/

10-12 19:56