아래 코드에서 >>
을 사용하여 IO 작업을 함께 연결합니다. 그러나 AFAIU, m1>>m2
은 m1>>=(\_.m2)
으로 de-sugared되고 바인딩하는 경우 바로 첫 번째 IO 작업을 실행합니다. 모든 인쇄가 주체에서 일어나길 원합니다. 즉, print 문이 입력 문 ("코드 입력")과 인터리브되지 않아야합니다. do
이후로는 [IO()]
과 같이 IO보다 다른 모나드를 반환 할 수 없습니다. 원하는 인쇄 효과를 얻으려면 어떻게해야합니까?두 IO() 모나드를 실행하지 않고 어떻게 바인딩 할 수 있습니까?
f :: [Int] -> IO()
f inventory = do
putStrLn "Enter Code\n"
x <- getLine
let idx = nameToIndex x
putStrLn "Quantity\n"
y <- getLine
putStrLn "More?\n"
c <- getChar
let q = (read y :: Int)
let curM = if inventory !! idx >= q then (putStrLn "sdaf\n") else (putStrLn "Overflow!\n")
if c == 'Y' then curM>>(f (update inventory idx)) else curM
main = f [1, 2]
아니요'IO'는 IO를 수행하지 않기 때문에 * 처음 상태의 IO를 즉시 실행하지 않습니다. * 기계의 상태를 수정하는 방법을 설명합니다. * 단순히 컴퓨터의 상태를 수정하는 것입니다. 두 개의 'IO'. 사실 하스켈에서는 실제로 필요한 경우를 제외하고는 아무 것도 실행되지 않습니다. –