2012-02-02 60 views
0

我試圖使用OOHaskell實現矩形問題。OOHaskell中的示例錯誤示例問題

{-# 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") 

rectangle length width self 
      = do 
      lengthRef <- newIORef value 
       widthRef <- newIORef width 
       return $ 
       getLength .=. readIORef lengthRef 
      .*. getWidth .=. readIORef widthRef 
      .*. setLength .=. writeIORef lengthRef 
      .*. setWidth .=. writeIORef widthRef 
      .*. lengthenBy .=. (\dv -> 
       do 
        value <- self # getValue 
        (self # setValue) (value + dv)) 
      .*. incr  .=. (self # (lengthenBy 1)) 
      .*. emptyRecord 

但我得到範圍錯誤。錯誤消息是

Rectangle.hs:21:38: Not in scope: `widthRef' 
Rectangle.hs:22:39: Not in scope: `lengthRef' 
Rectangle.hs:23:39: Not in scope: `widthRef' 

我該如何解決錯誤?

謝謝丹尼爾做到了。但現在我得到的錯誤是:

The function `lengthenBy' is applied to one argument, 
but its type `Proxy LengthenBy' has none 
In the second argument of `(#)', namely `(lengthenBy 1)' 
In the second argument of `(.=.)', namely `(self # (lengthenBy 1))' 
In the first argument of `(.*.)', namely 
    `incr .=. (self # (lengthenBy 1))' 
+0

什麼是*矩形問題*? – Ingo 2012-02-02 11:56:37

+0

問題中有一個簡單的矩形和一些基本的功能,對它進行操作.. – 2012-02-02 12:32:51

回答

3

解決您的縮進:

 = do 
     lengthRef <- newIORef value 
      widthRef <- newIORef width 

的的lengthRef「L」和的widthRef「W」必須是在同一列。

因爲它的立場,它解析爲

= do lengthRef <- newIORef value widthRef <- newIORef ... 

但是,我認爲,應該產生一個語法錯誤,並且未達到「不在範圍內」的階段。所以我想這不是在你的實際代碼中,而是在這裏出現粘貼故障。

然後:

  return $ 
      getLength .=. readIORef lengthRef 
     .*. getWidth .=. readIORef widthRef 
     .*. setLength .=. writeIORef lengthRef 
     .*. setWidth .=. writeIORef widthRef 
     .*. lengthenBy .=. (\dv -> 
      do 
       value <- self # getValue 
       (self # setValue) (value + dv)) 
     .*. incr  .=. (self # (lengthenBy 1)) 
     .*. emptyRecord 

休息吧,.*.縮進低於DO-塊縮進,所以它解析爲

(do ... 
    getLength .=. readIORef lengthRef) .*. getWidth .=. ... 

縮進的東西,你想要去的return靠內側比封閉的do-block要好。

+0

從來沒有使用OOHaskell,所以我不知道什麼都是類型,但是從錯誤信息中,可能的原因是它應該是' ((self#lengthenBy)1)''而不是'(self#(lengthenBy 1))''。 – 2012-02-02 11:53:51