2012-02-06 5 views
2

이 프로그램에는 인터페이스 IPoint과 인터페이스 동작을 구현하는 기능 포인트 (C++의 클래스 역할을 함)가 있습니다. 함수 포인트가 IPoint를 구현하지만 그렇게 할 수 없다는 것을 선언하는 많은 방법을 시도했다.OO 하스켈에서 인터페이스 구현

{-# LANGUAGE EmptyDataDecls, TypeOperators, FlexibleContexts, FlexibleInstances,UndecidableInstances, MultiParamTypeClasses, ScopedTypeVariables, DeriveDataTypeable, TemplateHaskell #-} 
{-# OPTIONS_GHC -fcontext-stack=100 #-} 

module Point where 

import OOHaskell 

$(label "read'") 
$(label "load") 
$(label "incr") 


type IPoint a = 
    Record (Read' :=: IO a 
      :*: Load :=: (a-> IO()) 
      :*: Incr :=: IO() 
      :*: HNil) 

--point value self = self :: IO (IPoint a) 
point value self 
    = do 
    valueRef <- newIORef value :: IO (IORef Integer) 
    returnIO $ 
     read' .=. readIORef valueRef 
    .*. load .=. (\v -> writeIORef valueRef v) 
    .*. incr .=. modifyIORef valueRef (+1) 
    .*. emptyRecord 

어떻게 기능 점수가 IPoint를 구현하도록 지정할 수 있습니까 ??

답변

2
point :: Integer -> b -> IO (IPoint Integer) 

n.b.

  1. 최고 수준의 유형 약어는 항상 (보통 직후, 예를 들어, point) 다른 곳에서 정의 된 값의 형태가 아닌 표현 (예를 들어, point value self)의 유형을 명시.

  2. 두 번째 인수는 사용되지 않으므로 모든 유형이 될 수 있습니다. 이 IORef IntegervalueRef의 유형을 하드 코드 때문에

  3. 함수는 IPoint a는, 그것이 IPoint Integer 생성 생성하지 않습니다.

하스켈에서 OO를하는 것이 좋습니다. 확실히 관용적이지 않습니다.