원칙적으로 haskell의 형식 시스템은 순수한 함수에서 불순한 함수 (즉, f :: a -> IO b
)를 호출하는 것을 금지한다고 생각했지만 오늘은 return
으로 호출하여 실현했습니다. 예에서 :순수 함수 내에서 IO 작업의 의미는 무엇입니까?
h :: Maybe()
h = do
return $ putStrLn "???"
return()
이제, 어쩌면에 h
작품 모나드,하지만 그럼에도 불구하고 순수한 기능입니다. 실제로 컴파일 및 실행하면 실제적으로 I/O를 수행하지 않고도 예상대로 Just()
을 반환합니다. 나는 haskell의 게으름이 함께 물건을 넣는다고 생각한다. (즉, putStrLn
의 반환 값은 사용되지 않는다. 그리고 그 값 생성자가 숨겨져 있고 패턴 매치가 불가능하므로이 코드가 합법적 인 이유는 무엇인가? 이것을 허락하는 다른 이유가 있습니까?
보너스와 관련된 질문 : 일반적으로 다른 사람들의 모나드 행위를 모두 금지 할 수 있습니까? 방법?
어떻게하면 모나드에 포함 된 값과 패턴 매치 할 수있는 가능성을 부여하여 다른 모나드로부터 액션을 실행할 수 있습니까? –
하나의 모나드를 다른 모나드로 변환하는 메소드를 작성하거나 실행합니다. 'Control.Monad.ST.stToIO'는'ST' 계산을'IO' 계산으로 변환합니다. –
맑음. 둘 다 감사합니다! –