2012-05-04 2 views
2

사실, 우리는 독립적으로 입출력 모나드를 구현할 수 없다는 것을 알고 있지만 그 이유는 정확히 알지 못합니다. 이 코드는 함수형 언어를 사용하여 명령 패러다임을 구현하려는 시도입니다. 이 예제와 실제 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 

답변

11

난 당신이 보여 주려하는지 모르겠어요. 기존 구현 인 IO을 대상으로 Haskell에 IO의 인코딩을 삽입했습니다.

열쇠는 unsafePerformIOprint --- 다른 IO 시스템에서 빌려 온 기본 요소를 사용하는 것입니다.

고려 : 다른 IO 시스템이없는 경우에는 어떻게해야할까요? 따라서 print 또는 다른 방법으로 기본 IO 기능을 호출 할 필요가 없습니다. IO는 어떻게 구현합니까?

하스켈에서 IO 추상화를 여러 가지 방법으로 구현할 수 있지만 실제로는 새로운 런타임 원시 함수를 사용해야 만 실제 IO를 수행하기 위해 실제로 운영 체제를 호출해야합니다. 그것은 기본적으로 하스켈에서 구현 될 수없는 비트입니다. 참고로


, 박사 학위 논문 "A Functional Specification of Effects" 참조 순수 기능 데이터 형식 IO의 사양 IO 및 기타 효과 하스켈로 인코딩 된 다양한 방법의 개요를 제공하고, 정의 WOUTER Swierstra (당신이 한 일의 연장의 종류).

enter image description here

+0

답장을 보내 주셔서 감사합니다. 이 사이트에 새로운 사람이 생겼습니다. 그래서이 주제에서 나중에 몇 가지 질문을하면 누군가가 알아 차릴 것입니까? 아니면 새로운 주제를 만드는 것이 더 좋을까요? – user1374768

+0

그건 그렇고, 내 질문은이 튜토리얼 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

+0

RealWorld -> (a, RealWorld)로 정의 된 IO 유형이 여기에 사용되므로 가짜 매개 변수를 사용하여 동작 시퀀스가 ​​구현됩니다 현실 세계. 그러나 IMHO 모델은 외부 컴파일러 해킹이없는 순수 언어에서는 불가능합니다. 그래서 왜이 구현이 사용되는지 궁금합니다. pdf가 더 명확하게 설명 할 수 있기를 바랍니다. – user1374768