1

なぜこれが起こっているのか疑問です。私は「YesodWeb」の電子ブックをフォローしていますが、足場のあるサイトを持っています。「messages」ファイル内で「plural」の関数を適用したい位置に到達すると、コンパイラは次のエラーを返します。

Foundation.hs:52:1:範囲外:`plural'

私が「ハムレット」と呼んでいるものと同じ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")
4

1 に答える 1

3

GHC ユーザーマニュアルを見てみましょう: http://www.haskell.org/ghc/docs/7.4.2/html/users_guide/template-haskell.html#id684916

プレイ中のステージングの制限は、2 番目の箇条書きで説明されています。

別のモジュールからインポートされた関数は、コンパイル時にのみ実行できます。つまり、モジュール内で関数を定義して、同じモジュール内のスプライス内から呼び出すことはできません。(そうするのは理にかなっていますが、実装するのは難しいです。)

于 2013-03-25T14:26:44.923 に答える