2013-04-29 12 views
5

ハスケルで "ap"モナドを使う正しい方法は何ですか?私はこれに似た何かをしたい:Haskell Quine: "ap" Monad

main = (putStr . ap (++) show) "main = (putStr . ap (++) show) " 

を私はエラーが出る「スコープではありません: 『AP』」を

「import Control.Monad」を使用しても何も起こりません。 そして私は、私は

答えて

8

Control.Monadのインポートあなたapを与える必要があります「`AP」の型シグネチャを伴う結合が欠けている」得るそれを

"ap :: Monad m => m (a -> b) -> m a -> m b" 

を与えて試してみました。しかし、GHC(7.6.1以降)の最新バージョンを除くすべてのバージョンでは、機能のためにmonadインスタンスを使用するには、Control.Monad.Instancesをインポートする必要があります。

また、あなたはあなたのApplicativeに一般apある<*>オペレータ、だけでなく、機能とそれを使用するために必要なインスタンスを与えるControl.Applicativeをインポートすることができます。

+2

また、インポートを避けたい場合は、どちらのモジュールもインポートするのではなく、 '(\ fgx - > fx(gx))'(S結合子 '(<*>)'と 'ap'タイプのクラスジェネリックバージョン)。 –

+0

ありがとうございました! – GossJ

+0

@サクンティム:誰が標準的なライブラリ関数を "インポートを避ける"だけに再定義するでしょうか?つまり、あなたはどんなに重要でないプログラムでも、輸入が必要です。 –

関連する問題