하스켈을 사용하여 연결 채널에서 읽는 무한 루프를 정의하려고 할 때, 나는 부분적으로 적용된 함수의 무한한 목록을 모나드의 Kleisli 구성으로 접는 것에 대해 생각해 보았습니다. 그 아이디어는 그럴듯하고 단순 해 보였지만 입력을 기다리는 대신 무한한 목록을 평가하는 이상한 시나리오를 발견했습니다. 나는 위의 코드를 실행하면Kleisli 작곡 및 무한리스트 위의 접기
loop :: Int -> IO Int
loop s = (foldr (<=<) return (repeat process)) s
process :: Int -> IO Int
process i = do
putStrLn $ show i
x <- getLine
return $ i + 1
main = loop 0
, GHCi는 스택 오버 플로우 후 중지 :
나는 내 문제를 보여 다음 예제를 만들었습니다. "getLine"을 기다리지 않습니다. < = <을> =>으로 바꿀 때 예상대로 작동합니다. 목록은 각 "getLine"후에 요소별로 평가 된 요소 만 가져옵니다.왜 이런 일이 발생합니까? 내 foldr 초기 값은 반환 값이며, 모나드 법칙에 따라 부작용을 추가해서는 안되며, 왼쪽 및 오른쪽 ID는 < = < 및> =>을 모두 사용하여 동일한 동작을 보장해야합니다.
> => 평가 순서를 반대로 바꾸는 것이 그 영향을 받는다는 사실을 잊어 버렸습니다. 당신의 대답은 짧고 분명했습니다. 고마워요! –