2012-02-06 4 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. Второй аргумент не используется, следовательно, он может быть любого типа.

  3. Ваша функция не генерирует IPoint a, он генерирует IPoint Integer, потому что он жёстко типа valueRef как IORef Integer.

Я не уверен, что выполнение OO в Haskell - хорошая идея. Это, конечно, не идиоматично.

Смежные вопросы