我怀疑为什么会这样。我一直在关注“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")
答案 0 :(得分:3)
查看GHC用户手册:http://www.haskell.org/ghc/docs/7.4.2/html/users_guide/template-haskell.html#id684916
播放中的分段限制在第二个要点中描述:
如果从中导入函数,则只能在编译时运行函数 另一个模块。也就是说,您无法在模块中定义函数,并且 从同一模块中的拼接中调用它。 (这是有道理的 这样做,但很难实现。)