在这个程序中有一个接口 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 ??
答案 0 :(得分:2)
point :: Integer -> b -> IO (IPoint Integer)
n.b。
顶级类型注释总是说明在其他地方定义的值的类型(通常是紧接着之后,例如point
),而不是表达式的类型(例如point value self
)。
未使用第二个参数,因此它可以是任何类型。
您的函数未生成IPoint a
,因此会将IPoint Integer
的类型硬编码为valueRef
。
我不确定在Haskell中做OO是个好主意。这当然不是惯用语。