在OO Haskell中实现接口

时间:2012-02-06 05:41:25

标签: haskell

在这个程序中有一个接口 IPoint 和一个实现接口行为的函数点(在c ++中充当类)。我尝试了很多方法来声明函数点实现IPoint但不能这样做。

{-# 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 ??

1 个答案:

答案 0 :(得分:2)

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

n.b。

  1. 顶级类型注释总是说明在其他地方定义的值的类型(通常是紧接着之后,例如point),而不是表达式的类型(例如point value self)。

  2. 未使用第二个参数,因此它可以是任何类型。

  3. 您的函数未生成IPoint a,因此会将IPoint Integer的类型硬编码为valueRef

    < / LI>

    我不确定在Haskell中做OO是个好主意。这当然不是惯用语。