Haskell 功能超出范围

Haskell 功能超出范围,haskell,web,messages,yesod,Haskell,Web,Messages,Yesod,我怀疑为什么会发生这种情况。我一直在关注“YesodWeb”电子书,但有一个搭建的网站。当我到达一个我想要在“消息”文件中应用“复数”函数的位置时,编译器返回以下错误: Foundation.hs:52:1:不在范围内:`复数' 其中复数在同一个hs文件中声明,我称之为“哈姆雷特”之一。但是,如果我将函数声明移到“Foundation.hs”文件中的#52行之前,那么错误就会消失,并让我有效地编译它。为什么会发生这种情况 module Handler.UserProfile where imp

我怀疑为什么会发生这种情况。我一直在关注“YesodWeb”电子书,但有一个搭建的网站。当我到达一个我想要在“消息”文件中应用“复数”函数的位置时,编译器返回以下错误:

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

其中复数在同一个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")
module Handler.UserProfile其中
进口
导入数据。可能(来自可能)
导入数据.Text(打包、解包)
viewCountName::Text
viewCountName=“UserProfileViews”
readInt::String->Int
readInt=read
复数::Int->String->String->String
复数1 x ux=x
复数形式uy=y
getUserProfileR::Handler RepHtml
getUserProfileR=do
viewCount>=返回。(1 +) . 阅读。打开从“0”开始
setSession viewCountName(pack$show viewCount)
女佣用户电子邮件
默认布局$do
setTitleI MsgUserProfile
$(widgetFile“nhUserProfile”)

查看GHC用户手册:

第二个要点中描述了起作用的登台限制:

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


我真的不知道是的,但是看到
$(…)
?这就是模板haskell——在编译时执行的代码,我相信它只能看到使用之前的定义。请注意,当luqui说“在使用之前”时,他的意思是这确实是一个位置问题。与Haskell land的其他部分相反,从源文件开始到任何给定模板Haskell splice(
$(…)
)的代码必须是自包含的。@luqui请注意将其作为一个答案,这样这个问题就不会被统计为未回答。