2013-03-19 195 views
1

我懷疑爲什麼會發生這種情況。我一直在關注「Yesod Web」電子書,但有一個腳手架的網站。當我到達想要在「messages」文件中應用「plural」函數的位置時,編譯器返回此錯誤:功能超出範圍

Foundation.hs:52:1:not in scope:`plural'

其中複數是在與我稱之爲「哈姆雷特」的hs文件相同的hs文件中聲明的。但是,如果我在「Foundation.hs」文件的第52行之前移動函數聲明,那麼錯誤消失了,它讓我可以有效地進行編譯。爲什麼會發生?

module Handler.UserProfile where 

import Import 
import Data.Maybe (fromMaybe) 
import Data.Text (pack, unpack) 

viewCountName :: Text 
viewCountName = "UserProfileViews" 

readInt :: String -> Int 
readInt = read 

plural :: Int -> String -> String -> String 
plural 1 x _ = x 
plural _ _ y = y 

getUserProfileR :: Handler RepHtml 
getUserProfileR = do 

    viewCount <- lookupSession viewCountName 
       >>= return . (1 +) . readInt . unpack . fromMaybe "0" 
    setSession viewCountName (pack $ show viewCount) 

    maid <- maybeAuth 
    --msg <- getMessageRender 
    let user = case maid of 
        Nothing -> "(Unknown User ID)" --show MsgHello -- 
        Just (Entity _ u) -> userEmail u 
    defaultLayout $ do 
     setTitleI MsgUserProfile 
     $(widgetFile "nhUserProfile") 
+6

我真的不知道耶索德,但見'$(...)'?這就是模板haskell - 在編譯時執行的代碼,我相信它只能在使用之前看到定義。 – luqui 2013-03-19 22:11:57

+4

請注意,當luqui說「在使用之前」他確實意味着這是一個位置問題。與Haskell-land的其餘部分相反,從源文件開始到任何給定模板Haskell拼接('$(...)')的代碼都必須是獨立的。 – 2013-03-20 00:31:18

+2

@luqui將這個問題轉化爲一個答案,以便這個問題不會被計算爲SO統計數據未答覆。 – Davorak 2013-03-20 03:29:19

回答