В этой программе есть интерфейс 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?