Используя Юлиуса вне Йесода
Я пытаюсь выяснить, как генерировать код 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
}