0

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\
          \      ")]
4

1 に答える 1

1

ドキュメントでわかるように、ToJavascriptクラスにはのインスタンスしかありません

  • 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はわかりません。

于 2016-05-23T13:56:46.767 に答える