【问题标题】:using Julius outside Yesod在 Yesod 外使用 Julius
【发布时间】:2015-10-29 01:20:50
【问题描述】:

我正在尝试弄清楚如何在 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
    ...

请帮忙。我不知道它需要什么,我刚开始看朱利叶斯。如果我删除插值,那么它会成功呈现文本。

【问题讨论】:

    标签: haskell yesod yesod-julius


    【解决方案1】:

    试试这个:

    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

    【讨论】:

      【解决方案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       
      }
      

      【讨论】:

        猜你喜欢
        • 2013-10-22
        • 2014-02-08
        • 2020-03-12
        • 1970-01-01
        • 2013-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        相关资源
        最近更新 更多