Haskell / Julius模板 - 不能拼接变量

时间:2016-05-23 13:27:08

标签: haskell yesod shakespeare-text yesod-julius

我认为有些东西我不明白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\
          \      ")]

1 个答案:

答案 0 :(得分:1)

作为the documentation can tell youToJavascript类只有

的实例
  • Bool
  • RawJavaScript
  • JSON Values。这些是你想要使用的。


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提供至少一个实例,我不知道。