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

err*_*ter 1 haskell applicative

我有一个功能:

someFun :: Applicative f => f a -> b -> f c
someFun x y = …
Run Code Online (Sandbox Code Playgroud)

对于这个论点y我需要给someFun是"FB"那可以说我有值

someX :: Applicative f => f a
someY :: Applicative f => f b
Run Code Online (Sandbox Code Playgroud)

我试着这样做

LiftA (someFun someX) someY
Run Code Online (Sandbox Code Playgroud)

但这给了我 f (f c)

我需要结果 f c

Rei*_*chs 8

你要求的是Monads可以做事情,但是Applicative 不能.使用Monad实例,这只是join:

join :: Monad m => m (m a) -> m a
Run Code Online (Sandbox Code Playgroud)

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

  • @ReinHenrichs假设我们必须从外面使用`someFun`.如果我们可以改变`someFun`的源代码来产生一个新函数`someFun',我们可能会发现我们可以改变内部结构,导致类型为`someFun'的函数:: Applicative f => fa - > fb - > fc`.如果没有看到"someFun"的来源,这是不可能的. (2认同)
  • @ReinHenrichs绝对是!这就是为什么这是一个评论,而不是一个答案:我认为OP提出错误的问题,而我只是想提醒他可能(事实上,我相信*可能*)他的问题可能比他更灵活想. (2认同)