在這個Haskell代碼中,構造函數參數(長度和寬度)可以是任何數據類型(如Int,Char等)。有沒有一種方法可以明確指定長度和寬度的數據類型? 如何指定函數getLength的返回類型?在OO中指定數據類型Haskell
{-# LANGUAGE EmptyDataDecls, DeriveDataTypeable, TemplateHaskell #-}
{-# OPTIONS_GHC -fcontext-stack=100 #-}
module Rectangle where
import OOHaskell
$(label "getLength")
$(label "getWidth")
$(label "incr")
$(label "lengthenBy")
$(label "setLength")
$(label "setWidth")
$(label "show'")
rectangle length width self
= do
lengthRef <- newIORef length
widthRef <- newIORef width
return $
getLength .=. readIORef lengthRef
.*. getWidth .=. readIORef widthRef
.*. setLength .=. writeIORef lengthRef
.*. setWidth .=. writeIORef widthRef
.*. lengthenBy .=. (\dl ->
do
length <- self # getLength
(self # setLength) (length + dl))
.*. incr .=. (self # lengthenBy) (1)
.*. show' .=. printLn ("Length : "<< self # getLength<<" Width : "<< self # getWidth)
.*. emptyRecord
主要應該工作(這是),如果它是這樣寫的:
main = do
c1 <- mfix $ rectangle 0 0
c2 <- mfix $ rectangle 0 0
c3 <- mfix $ rectangle 0 0
c1# setWidth $ 3
c2# setWidth $ 2
c3# setWidth $ 2
c1# incr
c2# incr
c1# incr
c1# show'
c3# show'
但主要的工作,即使它是這樣寫的這是不可取的(如寬度不能是一個字符)。
main = do
c1 <- mfix $ rectangle 0 'a'
c2 <- mfix $ rectangle 0 'b'
c3 <- mfix $ rectangle 0 'c'
c1# setWidth $ 'd'
c2# setWidth $ 'e'
c3# setWidth $ 'f'
c1# incr
c2# incr
c1# incr
c1# show'
c3# show'
但隨後會是怎樣的TypeOfSelf和ReturnTypeOfRectangle? – 2012-02-03 06:36:21
我想這與OOHaskell有關,你應該查閱文檔,不管自指針是最後一個參數還是什麼。在常見的面嚮對象語言中,它通常是頂級對象或普通指針。我不知道他們在OOHASKELL的等值 – LeleDumbo 2012-02-03 06:45:29