2013-03-19 149 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

回答