Haskell Quine:"ap"Monad

Gos*_*ssJ 6 monads haskell quine

在Haskell中使用"ap"monad的正确方法是什么?我想做类似的事情:

main = (putStr . ap (++) show) "main = (putStr . ap (++) show) "
Run Code Online (Sandbox Code Playgroud)

但我收到错误"不在范围内:'ap'."

使用"import Control.Monad"什么都不做.我试过给它

"ap :: Monad m => m (a -> b) -> m a -> m b" 
Run Code Online (Sandbox Code Playgroud)

然后我得到"'ap'的类型签名缺少附带的绑定"

ham*_*mar 10

导入Control.Monad应该给你ap.但是,除了最新版本的GHC(7.6.1和更新版本)之外,您还需要导入Control.Monad.Instances以使用monad实例来实现功能.

或者,您可以导入Control.Applicative为您提供概括的<*>运算符,以及将其与函数一起使用的必要实例.apApplicative

  • 或者,如果我们想要避免导入,而不是导入任何模块,我们可以使用`(\ fgx - > fx(gx))`(S组合子,其中`(<*>)`和`ap`是类型类通用版本). (2认同)
  • @NiklasB.:可能有人试图写一个Quine程序,就像GossJ试图做的那样.我没有弄清楚如何修改原始程序以合并导入,因为内联S组合器只是立即工作. (2认同)