我认为有些东西我不明白julius中的拼接方式是什么,没有任何内置类型会拼接。我可以获得编译代码的唯一方法是使用rawJS。
例如:
import Prelude.Unicode
import Text.Julius
import Text.Shakespeare -- not sure if this is needed
import Text.Shakespeare.Text -- not sure if this is needed
...
test = renderJavascript $ jsCode (⊥)
where
yval = rawJS $ show (3 ∷ Int) -- works
-- yval = show (3 ∷ Int) -- no instance of toJavascript
-- yval = 3 ∷ Int -- no instance of toJavascript
jsCode = [js|
var y = #{yval};
|]
FWIW我没有使用yesod,只是图书馆的julius模板部分,但我认为这不应该重要。
如果我尝试拼接Int本身,我会收到如下错误:
No instance for (ToJavascript Int)
arising from a use of ‘toJavascript’
In the expression: toJavascript yval
In the first argument of ‘mconcat’, namely
‘[Javascript
((Data.Text.Internal.Builder.fromText . pack')
"\n\
\ var y = "),
toJavascript yval,
Javascript
((Data.Text.Internal.Builder.fromText . pack')
";\n\
\ ")]’
In the expression:
mconcat
[Javascript
((Data.Text.Internal.Builder.fromText . pack')
"\n\
\ var y = "),
toJavascript yval,
Javascript
((Data.Text.Internal.Builder.fromText . pack')
";\n\
\ ")]
答案 0 :(得分:1)
作为the documentation can tell you,ToJavascript
类只有
Bool
RawJavaScript
Value
s。这些是你想要使用的。
import Data.Aeson
test = renderJavascript $ jsCode (⊥)
where
yval = Number 3
jsCode = [js|
var y = #{yval};
|]
...或者,如果给出yint = 3 :: Int
,则yval = Number $ fromIntegral yint
。两者都使用Number
构造函数使用Num
类型(因此您可以使用数字文字以及标准转换函数)这一事实,即Scientific
。
为什么,如果有ToJavascript
课程,他们也不会为Int
提供至少一个实例,我不知道。