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)는 get
및 put
도이 경우에만 사소한 일을 할 것을 요구하고, 그렇다면, 우리는 실제 유형의 인덱스 IO 데이터베이스를 구현하는 GHC의 타입 시스템을 속일 수 있습니까?
아니요, 유형 시스템을 속일 수 있다고하더라도 어셈블리 코드를 실행하고 필요한 유형을 가장하는 것은 불가능합니다. 실질적으로 실용적인 용어로'put'은 포인터를 얻습니다. 지적 데이터 구조에 대한 정보가 없으므로 저장할 방법이 없습니다. –
오, 실제로'put'은 포인터 자체를 저장할 수 있습니다. 물론 이것은 IO 작업으로 인해 뒷받침되지 않으며 프로그램이 종료되면 저장된 값이 사라집니다. 하나는 가비지 컬렉터 만 처리하면됩니다 (저장소에서 삭제할 때 수집 할 수없는 것으로 저장된 모든 포인터를 표시 함). –
고마워, 글쎄, 나는 실제로 그것을 듣게되어 기쁘다. 나는 절대적으로 나 자신을 그렇게 할 의사가 없다. 나는이 사용법을 '너무 다형성 (polymorphic)'으로 보였던 모나드 패키지에서 타입을 보았 기 때문에 이것을 물어 보았다. – mnish