2009-11-25 3 views
0

하스켈에서 객체 지향 언어와 같은 파이썬 용 인터프리터의 설계를 고려 중입니다. 내가 직면하고있는 하나의 특별한 문제는 객체 신원의 개념과 관련이 있습니다. 파이썬의 id(object) 함수를 고려해 보면,이 정의는 객체의 "신원 (identity)"을 반환한다는 것을 의미합니다. 이것이 수명 동안이 객체에 대해 유일하고 일정한 것으로 보장되는 정수 (또는 긴 정수)입니다. 수명이 중복되지 않는 두 객체는 ​​동일한 id() 값을 가질 수 있습니다. (구현 참고 사항 : 이것은 객체의 주소입니다.)하스켈에서 객체 신원의 개념을 모의 실험하는 방법

하스켈에서 이와 같은 개념을 구현하는 일반적인 방법은 무엇입니까?

답변

4

귀하의 통역사가 State 모나드에서 작동한다고 가정합니다. 아마도 주정부는 살아있는 물건과 겹침 선의 모음으로 구성 될 것입니다. 할 수있는 일은 사용 가능한 (사용되지 않은) id (Int으로 표시)의 목록을 추적하고 마다 Int, 즉 id으로 주석을 추가하는 것입니다. 이 id은 사용 가능한 id의 목록에서 가져 와서 생성시 할당되었습니다. 따라서 두 개의 Object 인스턴스가 같은 id을 가질 수는 없습니다.

내가 Int에 대해 이야기했는지 관찰합니다. Integer 초에 갈 수는 있지만 결국 효율성이 떨어질 수 있습니다. Int으로 들어가면 파괴 된 객체로 구성된 id을 다시 사용할 수있는 id 풀 (목록)에 다시 추가해야합니다. 그렇지 않으면 결국 밖으로 나가게됩니다. 따라서 나는 이런 식으로 뭔가를 구상 :

data Object a = Obj Int a 

instance Eq (Object a) where 
    Obj i _ == Obj j _ = i == j 

type InterpreterState a = State [Int] a 

createObject :: a -> InterpreterState (Object a) 
createObject a = do 
    (i:is) <- get 
    put is 
    return $ Obj i a 

destroyObject :: Object a -> InterpreterState() 
destroyObject (Obj i a) = do 
    modify (i:) 

(즉 InterpreterState 귀하의 경우에 훨씬 더 복잡 할 것 참고 및 createObjectdestroyObject 개체가 상태에서 제거/추가해야하지만 여기 지점 옆에 있습니다..)

+0

고맙습니다. 이것은 나에게 꽤 좋은 아이디어를 준다. –

3

이 질문에 대한 대답은 ID를 가져 오려는 이들 개체를 어떻게 구현할 것인가에 달려 있습니다. 두 변수가 같은 객체를 포함하면 어떻게 될 것입니까? 기본적으로 변수에 "변경 가능한"객체에 대한 참조를 저장해야 할 필요가 있습니다. 변수 이름에 단순한 값을 연관시키는 경우, 한 변수의 변경 사항은 절대로 다른 변수에 반영되지 않으며 오브젝트 ID와 같은 것이 없습니다.

그래서 변수는 객체의 실제 현재 값에 대한 참조를 보유해야합니다. 이것은 다음과 같이 수 :

data VariableContent = Int | String | ObjRef Int | ... 
data ObjStore = ObjStore [(Int, Object)] 
data ProgramState = ProgramState ObjStore VariableStore ... 

는 다음 각 ObjRefObjRef에 저장된 Int ID로 액세스 할 수 ObjStore의 값을 의미한다. 그리고이 Intid(object) 함수에 의해 반환 될 올바른 것입니다.

일반적으로 id 함수는 실제로 객체 참조를 구현하는 방법에 따라 크게 달라집니다.

관련 문제