2012-02-06 16 views
2

このプログラムには、インターフェイスIPointと、インターフェイスの動作を実装するファンクションポイント(C++のクラスとして機能する)があります。私は関数ポイントがIPointを実装していると宣言するために多くの方法を試しましたが、そうすることはできませんでした。OO Haskellでのインターフェイスの実装

{-# 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. 2番目の引数は使用されないため、任意の型を使用できます。

  3. あなたの関数がIPoint aを生成しません、それはIORef IntegerとしてvalueRefの種類をハードコードしているため、それは、IPoint Integerを生成します。

ハスケルでオブジェクト指向を行うのは良い考えです。確かに慣用ではありません。

関連する問題