2017-02-08 4 views
0

는 내가 Writer 모나드를 공부하고 다음과 같은 한 :Writer 모나드와 기능 구성?

myFunction :: Int -> Int -> Writer String Int 
myFunction e1 e2 
    | e1 > e2 = do 
     tell ("E1 greater") 
     return (e1) 
    | otherwise = do 
     tell ("E2 greater") 
     return (e2) 

main = do 
-- execWriter :: Writer w a -> w 
    print $ execWriter . myFunction 1 2 

오류 :

"Couldn't match type ‘WriterT String Data.Functor.Identity.Identity Int’with ‘a0 -> Writer c0 a1’ 
    Expected type: a0 -> Writer c0 a1 
    Actual type: Writer String Int" 

않는 이유는 무엇 .하지 $이 계산 오류? 아마도 기능 구성에 대한 나의 이해가 잘못되었을 수 있습니까?

+0

' (.) :: (b -> c) -> (a -> b) -> a -> c'연산자는 각각 하나의 인수를 취하는 두 개의 함수를 기대하며, 오른쪽의 'myFunction' 적어도 execWriter가 기대하는 것). –

+0

'(. :) = (.)을 정의 할 수도 있습니다. (.)'그리고 나서,'execWriter. : myFunction $ 1 2'을 사용하십시오. "올빼미 연산자"라고도합니다. ('(. :)'은 이미'Data.Composition'에 정의되어 있습니다 - http://hackage.haskell.org/package/composition-1.0.2.1/docs/Data-Composition.html) – zeronone

답변

4

.의 기능 구성은 결과 컴포지션에 인수가 있음을 의미합니다.

이 부분 :

execWriter . myFunction 1 2 

이 같은 더 명시 적으로 기록 할 수는 : 두 개의 인수를

(\x -> execWriter (myFunction 1 2 x)) 

myFunction 때문에, 당신은 컴파일 오류를 얻고있다. 확장

execWriter $ myFunction 1 2 

결과 코드는 다음과 동일합니다 : 유효

execWriter (myFunction 1 2) 

는이 같은 코드에서 $을 사용했다.

2

차드가 말했던 것 이외에도 정규 함수 응용 프로그램 ($을 사용하지 않고)은 .을 포함하여 모든 연산자 (중위 함수)보다 우선 순위가 높기 때문에 이러한 현상이 발생합니다.

이처럼 쓴 경우 예 일 것이다

는 : 다음에 평가

(\x -> execWriter (myFunction 1 x)) 2 

:

(execWriter . myFunction 1) 2 

에 해당 어느 아니라

execWriter (myFunction 1 2)