IO 모나드에 대한 비판은 세계에서 운영되는 상태 모나드로 간주됩니다


46

IOHaskell 의 모나드는 종종 국가가 세계인 주 모나드로 설명됩니다. 따라서 IO amonad 유형의 값은 다음과 같이 보입니다 worldState -> (a, worldState).

얼마 전에 나는이 견해를 비판 한 기사 (또는 블로그 / 메일 링리스트 게시물)를 읽었으며 이것이 틀린 이유를 몇 가지 제시했습니다. 그러나 나는 기사 나 이유를 기억할 수 없다. 아는 사람 있나요?

편집 : 기사가 잃어버린 것 같습니다. 여기에서 다양한 논쟁을 모으십시오. 더 흥미로운 일을하기 위해 현상금을 시작하고 있습니다.

편집 : 내가 찾고있는 기사는 Simon Peyton Jones 가 Haskell에서 모나드 입력 / 출력, 동시성, 예외 및 외국어 호출을 다루는 어색한 분대를 처리 합니다. (TacTics의 답변에 감사드립니다.)


1
그것은가 이 문서 (또는이 그 이전 버전 )?
Joachim Sauer

@JoachimSauer 감사합니다. 또한 흥미로운 기사이지만 제가 찾고있는 기사는 아닙니다. 그것은 하나의 세계 패러다임에 초점을 맞추 었습니다.
Petr Pudlák

내 머리 위로, 여기 에 의견 은 좋은 시작입니다
Adam

1
이 문맥에서 "세계"는 무엇을 의미합니까? 나는 그것이 "지구"를 의미하지 않는다고 가정합니다. 그것은 일종의 세계적인 범위입니까? 이것을 작성한 저자는 자신을 짧게 팔고 있습니다. 그가 동시에 독자들의 자아를 혼동하고 부수고 싶다면, 그것을 "국가는 우주"또는 "신 상태"라고 부릅니다. 세계. !! 요즘 젊은이들은 충분히 높이 갈망하지 않습니다!
GlenPeterson

답변:


33

문제 IO a = worldState -> (a, worldState)는 이것이 사실이라면 우리는 그것을 증명할 수 forever (putStrLn "Hello") :: IO a있고 undefined :: IO a동등하다는 것입니다. 다음은 dolio (2010, irc)의 증거 제공입니다.

forever m
 =
m >> forever m
 =
fix (\r -> m >> r)
 = {definition of >> for worldState -> (a, worldState)}
fix (\r -> \w -> r (snd $ m w))

렘마 : (\r w -> r (snd $ m w)) ⊥ = ⊥

(\r w -> r (snd $ m w)) ⊥
  =
\w -> ⊥ (snd $ m w))
  =
⊥ . snd . m
  =
⊥

따라서 forever m = fix (\r -> \w -> r (snd $ m w)) = ⊥

특히 forever (putStrLn "Hello") = ⊥따라서 및 forever (putStrLn "Hello")undefined해당 프로그램입니다. 그러나 이론상 또는 실제적으로 동등한 프로그램으로 간주되어서는 안됩니다.

동시성을 호출하지 않아도이 모델은 잘못되었습니다.


7
undefined하스켈의 순수한 의미론에서 비 종료 프로그램이 동등하다는 것에 놀란 사람이 있습니까? Haskell의 순수한 의미론에서 다른 ⊥는 구별 할 수없는 것으로 간주됩니다! 그러나 우리가 프로그램에 대해 운영 적으로 생각할 때 우리 는 다른 종류의 ⊥도 구별하려고합니다 IO. 나는 프로그램이 예외를 던지거나 무한 루프를 입력하는지 여부를 걱정합니다. 두 프로그램이 모두 pro임을 증명하여 동등하다는 것을 증명할 수 있습니다. 그것은 실제로 모순이 아닙니다.
Ben

3
⊥ 및 [0,1 ..]의 표시는 모두 "종료되지 않음"이지만 구별됩니다. 차이점은 ⊥는 비 종료 비생산적인 계산을 나타내며 [0,1 ..]은 비 종료이지만 생산적인 것입니다. 우리는 (영원히 (putStrLn "Hello")) 유사한 종료되지 않지만 생산적인 표시를 가질 것으로 기대합니다.
Russell O'Connor

1
그러나 반드시 forever (putStrLn "Hello")그렇지는 않습니다 [0,1..]. 귀하의 증거는 특정되지 worldState않으므로 일반 주 모나드에도 적용됩니다. 따라서 forever (someModificationWith "Hello")not 와도 같은 의미입니다. 나는 그 결과에 완전히 놀랐습니다. 그것은 의미 론적 의미론에서 생산적 이지 않으며 , 우리가 영원히 기다리는 동안 컴퓨터가 작동 하고있는 것은 무의미합니다. 같은 것 forever (putStrLn "Hello"); 그것은 우리가 어떻게 든 게으른 소비 할 수있는 새로운 세계 상태를 만들어 내지 않아야하며 그렇게해서는 안됩니다 .
Ben

명시적인 세계 상태 전달을 사용하는 Mercury 및 Clean과 같은 프로그래밍 언어 가 IO에 대한 선언적 모델을 근본적으로 잘못 제공합니까?
Ben

@Ben은 세계 전달이 동시성으로 어떻게 작동하는지 언급하고 있습니까? 머큐리의 동시성에 대한 로제타 코드를 보셨습니까? 의미 상 의미가 무엇인지 궁금했습니다.
CMCDragonkai 2019

12

다음은 간단한 답변입니다. 상태 모나드 상태로의 변경은 모나드에서 실행 된 작업으로 인한 것입니다. 실제로 "WorldState-> (a, WorldState)"설명이 동일한 속성을 요구하고 WorldState가 IO 모나드 만 변경하는 순수한 값이면 잘못된 것입니다. 시간 변경, 파일 내용, 핸들 상태 등은 IO 모나드에서 발생하는 것과 독립적으로 변경 될 수 있습니다. 이것이 IO 모나드의 핵심입니다. GHC가 RealWorld 값을 통과한다는 사실은 내가 아는 한 (ST 값에 넣을 수있는 것일 수도 있음) 순서대로 실행되도록 보장하는 것입니다.


8
실제로는 문제가되지 않습니다. 고정되지만 알 수없는 규칙 저장소에서 파생 된 월드 상태를 수정하여 바인드 작업을 모델링 할 수 있습니다.
sclv

1
@sclv : 예. 그러나이 고정하지만 알 수없는 규칙 저장소는 IO를 상태 모나드가 아닌 차별화 요소로 ,이 모순은 상태 모나드에서 찾을 수 없습니다
Jimmy Hoffa

WorldState 상태에 대해 들었던 주장은 동시성과 관련이 있지만 정확한 주장은 기억할 수 없습니다. 그러나 여전히 그렇더라도 WorldState가 미래를 인코딩 할 수 있다고 가정하므로 여전히 문제가 발생하지 않습니다. 물론, 뭔가 빠진 것 같습니다.
Thomas Eding

@JimmyHoffa : 규칙 저장소를 상태로 유지할 수 있습니다.
sclv

1
@JimmyHoffa : 이것이 추상화의 목적입니다. 또한 초기 의견에 대한 후속 조치를 위해 Clean은 사용자가 세상을 속이고 "중복"하지 않도록 고유 유형을 사용하여 명시적이고 행복하게 IO를 세계적으로 전달하는 모델로 만듭니다. 이것은 추상화를 시행하는 한 가지 방법입니다.
sclv

12

언어에 대한 런타임 시스템과 통신하는 비대칭 코 루틴의 형태로 IO를 모델링하는 방법에 대한 블로그 게시물을 작성했습니다. (그것은 분명히 시리즈의 세 번째 부분입니다)

http://comonad.com/reader/2011/free-monads-for-less-3/

그 포스트는 왜 '세계 통과'의 시맨틱에 대해 추론하기가 어색한 지에 대해 조금 다루고 있습니다.


+1-특히 흥미로운 것은 제가 디자인하고있는 언어의 IO를 이와 유사한 방식으로 구현할 계획 이었기 때문입니다! :)
Jules

8

어색한 분대 태클을 참조하십시오 .

가장 큰 이유는 IO 모나드의 RealWorld 상태 모델이 동시성과 잘 작동하지 않기 때문입니다. 이 읽을 수있는 고전에서 SPJ는이를 이해하기 위해 운영 의미를 사용하는 것을 선호합니다.


나는 이것이 내가 원하던 기사, 주로 3.1 절이라고 믿는다. 질문을 편집하기 전에 게시 한 경우 귀하의 답변을 수락했을 것입니다. 그러나 이제는 다른 사람들이 게시 할 모든 아이디어를보기 위해 끝날 때까지 기다리는 것이 더 공정하다고 생각합니다.
Petr Pudlák

5

RealWorld 상태 모델에 대한 주된 불만은 TacTics가 말했듯이 월드 패스가 동시성으로 작동하지는 않는다는 것입니다. 그러나 WOUTER Swierstra와 토르스텐 Altenkirch가 보여 어떻게 자신의 논문에서 스레드를 인터리빙의 임의의 고정하지만 시퀀스로, 효과 "세계가-통과"등의 동시성에 대한 이유를 "야수의 아름다움 : 기능 Sematics을 황당 분대에 대해" HTTP : //www.staff.science.uu.nl/~swier004/Publications/BeautyInTheBeast.pdf

이에 해당하는 코드는 Hackage에서 IOSpec으로 제공됩니다. http://hackage.haskell.org/package/IOSpec

Wouter의 논문은 더 자세하게 생각합니다. http://www.staff.science.uu.nl/~swier004/Publications/Thesis.pdf

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.