2015-08-06 2 views
3

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

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

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

ответ

3

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

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 из библиотеки эсона мы можем превратить 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  
} 
Смежные вопросы