在OO 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??

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

n.b.

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

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

  3. 函数不会生成IPoint a,而是生成IPoint Integer,因为它将valueRef的类型硬编码为IORef Integer

我不确定在Haskell中执行OO是否是个好主意。这当然不地道。

最新更新