2012-02-03 80 views
1

在這個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' 

回答

1

假設這是所有類型安全的getLength返回類型將匹配lengthRef的內容,所以你只需要在一些地方增加一個類型簽名限制該類型和getLength類型應該正確地從推斷。

例如,在創建lengthRef時,可以指定類型:

lengthRef <- newIORef (length :: Int) 
1

是否有通過,我可以明確地指定的長度和寬度的數據類型的方法嗎?

是:

rectangle :: TypeOfLength -> TypeOfWidth -> TypeOfSelf -> ReturnTypeOfRectangle 
rectangle length width self = ... 

我怎麼能指定功能的getLength的返回類型?

我從來沒有使用OOHaskell所以我不確定這一點。基本上,你可以聲明函數期望的類型(作爲參數)及其返回類型。語法就像上面的矩形,返回類型總是最右邊的一個。

參考:http://en.wikibooks.org/wiki/Haskell/Type_basics#Type_signatures_in_code

+0

但隨後會是怎樣的TypeOfSelf和ReturnTypeOfRectangle? – 2012-02-03 06:36:21

+0

我想這與OOHaskell有關,你應該查閱文檔,不管自指針是最後一個參數還是什麼。在常見的面嚮對象語言中,它通常是頂級對象或普通指針。我不知道他們在OOHASKELL的等值 – LeleDumbo 2012-02-03 06:45:29

1

你總是可以添加類型註釋你的構造,例如,當您創建IORef S,是這樣的:

widthRef :: IORef Int <- newIORef width 

或者對函數參數width本身相當。