2016-05-23 29 views
0

我認爲有些東西我不明白julius中的拼接是如何工作的,沒有任何內置類型會拼接。我可以用代碼編譯的唯一方法是使用rawJS。Haskell/Julius模板 - 不能拼接變量

例如:

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我不使用耶索德,就在圖書館的朱利葉斯模板的一部分,但不應該在這裏不管我想。

如果我嘗試拼接詮釋本身,我得到一個錯誤,如:

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

你能包括你的進口嗎? - 它會加快分析問題 – ErikR

+0

@ErikR增加了導入 – daj

回答

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的實例,我不知道。