일부 코드를 지속적으로 전달하지 않으려면 Reader
인스턴스 (->) r
을 사용하여 일부 코드를 정리하기로 결정했습니다. 이제IO 내부에서 Reader`(-> r)`을 사용하여 예기치 않은 동작이 발생합니까?
let p x y = print (x,y)
f = ($ (1 :: Int))
f $ ((>>) :: forall m a. m ~ (Int -> a) => m -> m -> m)
(p <$> (+ 2) <*> (+ 5) :: Int -> IO())
(p <$> (* 6) <*> (* 2))
((>>) :: forall m. m ~ IO() => m -> m -> m)
(f (p <$> (+ 2) <*> (+ 5) :: Int -> IO()))
(f (p <$> (* 6) <*> (* 2)))
내가 의심이 문제가 그 동안이다 : 수동으로 어떤 종류의 주석이 desugaring 퍼팅 후
let p x y = print (x,y)
f = ($ (1 :: Int))
f $ do
p <$> (+ 2) <*> (+ 5)
p <$> (* 6) <*> (* 2)
-- prints (6,2) but not (3,6)
do
f $ p <$> (+ 2) <*> (+ 5)
f $ p <$> (* 6) <*> (* 2)
-- prints both (6,2) and (3,6)
:
조금 주위를 연주 후, 나는 행동에서 다음과 같은 차이를 발견 IO 인스턴스에 대해 >>
이 내가 원하는 것을 수행하면, (-> r)
에 대한 >>
은 왼쪽면을 들여다 보는데 너무 게으른 것입니다.
내 질문은,이 게으름 문제를 실행하지 않고 이런 일을 할 수있는 방법이 있습니까 (아마도 변종입니까?).
확실하지 않은 경우 ReaderT
이 경우 도움이되지만 코드를 더 복잡하게 만드는 결과를 초래할 수 있으므로이를 시도하지 않았을 것입니다.
이것은 게으름과는 아무런 관련이 없습니다. – melpomene