Используя Юлиуса вне Йесода

Я пытаюсь выяснить, как генерировать код Javascript, используя автономный Julius вне yesod:

{-# 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
    ...

Пожалуйста помоги. Я понятия не имею, что ему нужно, я только начал смотреть на Юлиуса. Если я удаляю интерполяцию, то она успешно отрисовывает текст.

2 ответа

Решение

Попробуй это:

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 экземпляр, и с помощью toJSON из библиотеки Aeson мы можем превратить Int в Value,

С помощью 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       
}
Другие вопросы по тегам