2013-04-29 11 views
5

하스켈에서 "ap"모나드를 사용하는 적절한 방법은 무엇입니까? 나는이 비슷한 싶지 :하스켈 Quine : "ap"모나드

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

을하지만 난 오류 "뿐만 범위 :. 'AP'를"

"import Control.Monad"를 사용하면 아무런 효과가 없습니다. 내가

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

그때 내가 할 그것을주는 시도 당신에게 ap를 제공해야 Control.Monad 가져 오기

답변

8

를 "`AP의 유형 서명 '는 바인딩 동반 부족하다". 그러나 GHC (7.6.1 이상)의 최신 버전을 제외한 모든 버전에서 함수에 대한 monad 인스턴스를 사용하려면 Control.Monad.Instances을 가져와야합니다.

양자 택일로, 당신은 당신에게 apApplicative에 일반화되어있는 <*> 운영자뿐만 아니라 기능을 사용하는 데 필요한 인스턴스를 제공하는 Control.Applicative를 가져올 수 있습니다.

+2

그리고 수입을 피하려면 두 모듈 중 하나를 가져 오는 대신'(\ fgx -> fx (gx))'(S 결합 자'(<*>)'와'ap'가 타입 클래스 - 제네릭 버전). –

+0

대단히 감사합니다! – GossJ

+0

@sacundim : 누가 표준 라이브러리 기능을 "수입 방지"로 재정의하겠습니까? 내 말은, 당신은 어쨌든 중요하지 않은 프로그램을 위해 수입이 필요할 것입니다. –