사실, 우리는 독립적으로 입출력 모나드를 구현할 수 없다는 것을 알고 있지만 그 이유는 정확히 알지 못합니다. 이 코드는 함수형 언어를 사용하여 명령 패러다임을 구현하려는 시도입니다. 이 예제와 실제 IO의 차이점을 설명 할 수 있습니까? 함수 메인이 올바른 액션 명령을 구현하고 게으른 것처럼 보입니다.하스켈 내부 IO 구현
import System.IO.Unsafe
data Io a = Io a
runIO :: Io a -> a
runIO (Io a) = a
instance Monad Io where
return x = Io x
Io a >>= f = f a
-- internal side effect function
output :: Show a => a -> Io()
output s = return $! unsafePerformIO $ print s
----------------------------------------------------------------
mainIO :: Io()
mainIO = do output "A"
b <- return "B"
output b
output b
x <- return (undefined :: String)
return undefined
output "C"
head [output "C", output "C"]
output x
output "D"
test = runIO mainIO
출력 :
"A"
"B"
"B"
"C"
"C"
<interactive>: Prelude.undefined
답장을 보내 주셔서 감사합니다. 이 사이트에 새로운 사람이 생겼습니다. 그래서이 주제에서 나중에 몇 가지 질문을하면 누군가가 알아 차릴 것입니까? 아니면 새로운 주제를 만드는 것이 더 좋을까요? – user1374768
그건 그렇고, 내 질문은이 튜토리얼 http://www.haskell.org/haskellwiki/IO_inside와이 논문 http://webcache.googleusercontent.com/search?q=cache:ry-JwgJnib0J:research를 읽은 후에 나타난다. microsoft.com/pubs/67066/imperative.ps.z+hl=ru(a,RealWorld) – user1374768
RealWorld -> (a, RealWorld)로 정의 된 IO 유형이 여기에 사용되므로 가짜 매개 변수를 사용하여 동작 시퀀스가 구현됩니다 현실 세계. 그러나 IMHO 모델은 외부 컴파일러 해킹이없는 순수 언어에서는 불가능합니다. 그래서 왜이 구현이 사용되는지 궁금합니다. pdf가 더 명확하게 설명 할 수 있기를 바랍니다. – user1374768