2014-10-06 4 views
3

연습 중 하나 현실 세계 하스켈, ch. 24는 Control.Concurrent.MVar 주위에 엄격도 래퍼를 구현할 것을 요구합니다. 이 책에서 제안한대로 newtypeMVarS 래퍼를 사용하여 evaluatenewMVarputMVar과 같은 함수에 전달되는 모든 인수에 적용되도록합니다.명시 적 메소드 선언없이 fmap이 작동하게하는 이유는 무엇입니까?

이제는 감싸는 함수 중 하나가 mkWeakMVar이고 유형은 MVar a -> IO() -> IO (Weak (MVar a))입니다. 내 MVarS 빌더 함수가 엄격함을 구현한다고 가정하면 mkWeakMVar의 경우 MVar 대신 MVarS을 입력하는 것으로 충분하다고 가정했습니다.

import   Control.Concurrent.MVar 
import   System.Mem.Weak 

instance Functor Weak 

newtype MVarS a = MVarS (MVar a) 

mkWeakMVarS :: MVarS a -> IO() -> IO (Weak (MVarS a)) 
mkWeakMVarS (MVarS mv) x = (fmap . fmap) MVarS (mkWeakMVar mv x) 

이 GHCi가 Functor Weak에 대한 fmap의 명시 적 메소드 선언이 없다는 것을 경고에도 불구하고, 일을 나타납니다 : 그래서 다음 밝혔다. 그러나 그것은 나를 흥미롭게 만든다. 이 경우 fmap을 만드는 점은 무엇입니까?

+2

'Weak'을위한'fmap'이 호출되지 않는 경우에만 작동 할 수 있습니다. – augustss

답변

10

위의 코드는 typecheck되지만 누락 된 fmap 구현을 호출해야하는 값을 평가하려고하면 GHC가 중단됩니다. 이것은 오히려 치명적인과 완전히 피할 수 런타임 오류가 -Wall의 중요성을 입증 역할을한다고 때문에

*** Exception: /Users/tel/tmp/SO.hs:31:10-18: 
    No instance nor default method for class operation GHC.Base.fmap 

: 그것은 조금처럼 보일 것이다.