3

yesod の外でスタンドアロンの Julius を使用して Javascript コードを発行する方法を見つけようとしています。

{-# LANGUAGE QuasiQuotes #-}

import qualified Data.Text.Lazy.IO as LazyIO
import Text.Julius

main = do
    let delta = 1 :: Int
    LazyIO.putStrLn $ renderJavascript $ [julius|
        function f(x) {
          return x + #{delta};
        }
    |] undefined

しかし、私はこのエラーが発生しています:

t2.hs:8:48:
    No instance for (ToJavascript Integer)
      arising from a use of ‘toJavascript’
    In the expression: toJavascript delta
    ...

助けてください。何が必要なのかわかりません。ジュリアスを見始めたばかりです。補間を削除すると、テキストが正常にレンダリングされます。

4

2 に答える 2

3

これを試して:

import qualified Data.Text.Lazy.IO as LazyIO
import Text.Julius
import Data.Aeson

main = do
    let delta = toJSON (1 :: Int)
    LazyIO.putStrLn $ renderJavascript $ [julius|
        function f(x) {
          return x + #{delta};
        }
    |] undefined

説明:

deltaエラーメッセージは、インスタンスが必要であると言っていToJavascriptます。クラスを調べるToJavascriptと、これらのインスタンスがデフォルトで定義されていることがわかります。

ToJavascript Bool    
ToJavascript Value   
ToJavascript RawJavascript   

Int(またはInteger) インスタンスがないことで、エラー メッセージが説明されます。

ただし、ValueインスタンスがありtoJSON、Aeson ライブラリから使用することで、Intを に変換できますValue

于 2015-08-06T04:13:33.660 に答える
2

使用rawJSすると機能するはずです:

{-# LANGUAGE QuasiQuotes #-}

import qualified Data.Text.Lazy.IO as LazyIO
import Text.Julius

main = do
    let delta = rawJS $ show (1 :: Int)
    LazyIO.putStrLn $ renderJavascript $ [julius|
        function f(x) {
          return x + #{delta};
        }
    |] undefined

生産します:

function f(x) {
  return x + 1       
}
于 2015-08-06T04:17:08.663 に答える