避免嵌套应用程序,即 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 做什么。
我有一个功能:
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 做什么。