연습 중 하나 현실 세계 하스켈, ch. 24는 Control.Concurrent.MVar
주위에 엄격도 래퍼를 구현할 것을 요구합니다. 이 책에서 제안한대로 newtype
MVarS
래퍼를 사용하여 evaluate
이 newMVar
및 putMVar
과 같은 함수에 전달되는 모든 인수에 적용되도록합니다.명시 적 메소드 선언없이 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
을 만드는 점은 무엇입니까?
'Weak'을위한'fmap'이 호출되지 않는 경우에만 작동 할 수 있습니다. – augustss