2013-02-28 3 views
1

IO 작업 ( )에 의해 지원되는 일반 속성 맵을 작성하려고하지만 어떤 이유로 값 유형을 다형성으로 지정해야합니다.'forall v. Int -> v -> IO v` 유형에 유용한 주민이 있습니까?

type Key = Int 
get:: Key -> v -> IO v -- Takes a key and a default value, return the associated value 
put:: Key -> v -> IO() -- store (Key,v) pair doing some IO 

마 무료 정리 (theorem)는 getput도이 경우에만 사소한 일을 할 것을 요구하고, 그렇다면, 우리는 실제 유형의 인덱스 IO 데이터베이스를 구현하는 GHC의 타입 시스템을 속일 수 있습니까?

+3

아니요, 유형 시스템을 속일 수 있다고하더라도 어셈블리 코드를 실행하고 필요한 유형을 가장하는 것은 불가능합니다. 실질적으로 실용적인 용어로'put'은 포인터를 얻습니다. 지적 데이터 구조에 대한 정보가 없으므로 저장할 방법이 없습니다. –

+0

오, 실제로'put'은 포인터 자체를 저장할 수 있습니다. 물론 이것은 IO 작업으로 인해 뒷받침되지 않으며 프로그램이 종료되면 저장된 값이 사라집니다. 하나는 가비지 컬렉터 만 처리하면됩니다 (저장소에서 삭제할 때 수집 할 수없는 것으로 저장된 모든 포인터를 표시 함). –

+0

고마워, 글쎄, 나는 실제로 그것을 듣게되어 기쁘다. 나는 절대적으로 나 자신을 그렇게 할 의사가 없다. 나는이 사용법을 '너무 다형성 (polymorphic)'으로 보였던 모나드 패키지에서 타입을 보았 기 때문에 이것을 물어 보았다. – mnish

답변

8

일반적으로 IO에는 이상한 일이 발생할 수 있으므로 IO과 관련된 Free Theorems의 엄격한 개념은 없다고 생각합니다. 나는 약 IO을 알고있는이 구현 될 때부터 어쨌든, 가정 기능 (예 : 타입 V의 값을 생성 무의미 포인터 연산을 수행으로) 중단 할 수

  1. 아무것도,
  2. 이 중 하나를 사용하지를하지 않는다
  3. 가 바닥을 반환하지 않는 (일반적으로 추론 모든 자유와 같은 정리 (theorem)을 깰) 안전하지 않은 기능 (예 : undefined 또는 예외) 및
  4. 할 결국 "반환"

"반환 된"값이 매개 변수가됩니다.

그러나 이것은 IO을 사용하여 유형 색인화 된 데이터베이스를 구현하는 것이 가능한 것이므로 이 아니며이 될 수 있음을 의미합니다.

Typeable a 제약이있을 수 있습니다. 이 경우 기대되는 Free Theorem은 유지되지 않고 get 함수는 기본값 이외의 값을 반환 할 수 있습니다.

+0

감사합니다. 제한된 IO 세트와 관련된 이러한 종류의 공식 증명 예가 있습니까? – mnish

+0

내가 아는 그. –

관련 문제