我试图弄清楚如何使用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
...
请帮忙。我不知道它需要什么,我刚刚开始看朱利叶斯。如果我删除了插值,那么它会成功呈现文本。
答案 0 :(得分: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
个实例,通过使用Aeson库中的toJSON
,我们可以将Int
转换为Value
。
答案 1 :(得分: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
}