避免嵌套应用程序,即 Applicative f => f (f a)

Avoiding nested applicative i.e. Applicative f => f (f a)

我有一个功能:

someFun :: Applicative f => f a -> b -> f c
someFun x y = …

我需要给 someFun 的 y 参数是一个“f b” 可以说我有价值观

someX :: Applicative f => f a
someY :: Applicative f => f b

我试过了

LiftA (someFun someX) someY

但这给了我 f (f c)

我需要生成 f c

您要的是 Monad 可以做但 Applicatives 不能 的事情。对于 Monad 实例,这只是 join:

join :: Monad m => m (m a) -> m a

你要求的是不可能的,但至少现在你有一个完美的例子,说明你可以用 Monad 做什么,而你不能用 Applicative 做什么。