我懷疑爲什麼會發生這種情況。我一直在關注「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")
我真的不知道耶索德,但見'$(...)'?這就是模板haskell - 在編譯時執行的代碼,我相信它只能在使用之前看到定義。 – luqui 2013-03-19 22:11:57
請注意,當luqui說「在使用之前」他確實意味着這是一個位置問題。與Haskell-land的其餘部分相反,從源文件開始到任何給定模板Haskell拼接('$(...)')的代碼都必須是獨立的。 – 2013-03-20 00:31:18
@luqui將這個問題轉化爲一個答案,以便這個問題不會被計算爲SO統計數據未答覆。 – Davorak 2013-03-20 03:29:19