我正在玩 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/