功能超出范围

时间:2013-03-19 22:09:15

标签: haskell web messages yesod

我怀疑为什么会这样。我一直在关注“Yesod Web”电子书,但有一个脚手架网站。当我到达一个我想在“messages”文件中应用“复数”功能的位置时,编译器会返回以下错误:

Foundation.hs:52:1:不在范围内:`复数'

复数在同一个hs文件中声明为我称之为“hamlet”的文件。但是,如果我在“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")

1 个答案:

答案 0 :(得分:3)

查看GHC用户手册:http://www.haskell.org/ghc/docs/7.4.2/html/users_guide/template-haskell.html#id684916

播放中的分段限制在第二个要点中描述:

  

如果从中导入函数,则只能在编译时运行函数   另一个模块。也就是说,您无法在模块中定义函数,并且   从同一模块中的拼接中调用它。 (这是有道理的   这样做,但很难实现。)