2012-05-04 4 views
2

Я знаю как факт, что мы не можем реализовать монаду IO самостоятельно, но я не знаю, почему именно. Этот код является попыткой реализации императивной парадигмы с использованием функционального языка. Можете ли вы объяснить разницу между этим примером и истинным IO? Похоже, функция main реализует правильный порядок действий и остается ленивой.Выполнение ввода-вывода внутри Haskell

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 в качестве цели.

Ключом является использование вами unsafePerformIO и print --- примитивы, которые вы заимствуете из другой системы ввода-вывода.

Рассмотрите: что, если у вас не было другой системы ввода-вывода, чтобы опираться. Таким образом, нет print или другим способом вызова примитивных функций ввода-вывода. Как реализовать IO?

Так что, хотя вы можете реализовать абстракцию ввода-вывода многими способами в Haskell, вам всегда приходится падать на новые примитивные функции runtime, чтобы фактически вызвать операционную систему для выполнения реального ввода-вывода. Это бит, который не может быть реализован в Haskell изначально.


В качестве эталона, см диссертации "A Functional Specification of Effects", Wouter Swierstra, которая дает обзор различных способов ввод-вывод и другие эффекты были закодированы в Haskell, и определяет спецификацию IO как чисто функциональный типа данных (как продолжение того, что вы сделали).

enter image description here

+0

Спасибо за ответ и ссылку! Im новый на этом сайте, поэтому, если я задам несколько вопросов позже в этом разделе, кто-нибудь заметит это? Или будет лучше создать новую тему? – 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

Здесь используется тип IO, определенный как RealWorld -> (a, RealWorld), поэтому последовательность действий реализуется с использованием поддельного параметра Реальный мир. Но ИМХО эта модель невозможна на чистом языке без внешних взломов компилятора. Поэтому я удивляюсь, почему эта реализация используется, надеюсь, что в pdf более понятно объяснение. – user1374768

Смежные вопросы