我一直在玩GHCJS.FFI可用于从Haskell调用javascript,但我无法弄清楚如何反过来.假设我在Haskell中编写了一个非常实用的实用函数:
sayHello :: String -> IO ()
sayHello name = print $ "hello, " ++ name
Run Code Online (Sandbox Code Playgroud)
有可能做一些事情,所以我可以从Javascript调用它吗?我最接近的是注意到h$main(h$main2CMainzimain)
会触发我的Haskell主函数.
我正在尝试在Mac OSX上安装ghcjs-dom软件包.由于存在很多依赖关系,因此它很颠簸.Webkitgtk3是我目前的克星
cabal install ghcjs-dom
Resolving dependencies...
Configuring webkitgtk3-0.14.1.1...
Failed to install webkitgtk3-0.14.1.1
Build log ( /Users/markkaravan/.cabal/logs/webkitgtk3-0.14.1.1.log ):
[1 of 2] Compiling SetupWrapper ( /var/folders/br/4zwhphlx3816v87cc0bb5sxh0000gn/T/cabal-tmp-24401/webkitgtk3-0.14.1.1/SetupWrapper.hs, /var/folders/br/4zwhphlx3816v87cc0bb5sxh0000gn/T/cabal-tmp-24401/webkitgtk3-0.14.1.1/dist/setup/SetupWrapper.o )
[2 of 2] Compiling Main ( /var/folders/br/4zwhphlx3816v87cc0bb5sxh0000gn/T/cabal-tmp-24401/webkitgtk3-0.14.1.1/dist/setup/setup.hs, /var/folders/br/4zwhphlx3816v87cc0bb5sxh0000gn/T/cabal-tmp-24401/webkitgtk3-0.14.1.1/dist/setup/Main.o )
Linking /var/folders/br/4zwhphlx3816v87cc0bb5sxh0000gn/T/cabal-tmp-24401/webkitgtk3-0.14.1.1/dist/setup/setup ...
[1 of 2] Compiling Gtk2HsSetup ( Gtk2HsSetup.hs, dist/setup-wrapper/Gtk2HsSetup.o )
[2 of 2] Compiling Main ( SetupMain.hs, dist/setup-wrapper/Main.o )
Linking dist/setup-wrapper/setup ...
Configuring webkitgtk3-0.14.1.1...
setup: The pkg-config package 'webkitgtk-3.0' version >=1.8 is required but it
could not be found.
cabal: Error: some …
Run Code Online (Sandbox Code Playgroud) 如何在GHCJS中导入如下Javascript函数?
xs.subscribe(function(x) { console.log(x) })
Run Code Online (Sandbox Code Playgroud)
我尝试了以下各种组合而没有成功:
data Observable_
data Disposable_
type Observable a = JSRef Observable_
type Disposable = JSRef ()
foreign import javascript unsafe "$1.subscribe($2)"
rx_subscribe :: Observable a -> JSRef (a -> IO()) -> IO Disposable
Run Code Online (Sandbox Code Playgroud)
感谢任何帮助,并链接到GHCJS FFI的文档.
谢谢
是否可以使用ghcjs
?将Haskell模块编译为JS ?我玩它,但它似乎需要main
在生成JS之前定义函数.下面的玩具代码:
module Test where
add :: Int -> Int -> Int
add x y = x + y
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何使用它将其编译为JS ghcjs
.如果未定义main函数,它将仅编译.hi和.o文件.如果我能想出办法来把它编译成JS(在适当的Z-encoded
功能名称,以及相应的JS对象,像我们在FFI
为C),然后我可以使用更强大的Haskell库,例如unordered-containers
和vector
实现一些算法,编译成JS,并Elm
通过JS FFI使用.
Fay
似乎有能力做到这一点.我想首先调查一下ghcjs
.
如果是这样,那么我可以通过更改其(Haskell)配置让人们玩我的项目:在浏览器中重新编译它,然后在浏览器中重新运行它.我不关心速度.我只是想在浏览器中演示一个难以设置的基础桌面项目.因此,可能的新用户可以在几秒钟内看到他们是否喜欢它,而无需设置.
这将是多么酷!
从我读过的内容来看,GHCJS将STG编译成JavaScript.它说它使用GHC API,所以我们应该能够将它编译成JavaScript,就像任何其他Haskell库一样.(对吗?)虽然GHC运行时有很多C,但编译器本身是纯Haskell吗?
所以:
我有两个关于RPC调用的相关问题Yesod/Snap/Servant
:
假设我在服务器上有一个函数,用Haskell编写,由GHC编译:
add x y = x+y+42
怎么能:
GHCJS
),以类型安全的方式做所有这些吗?
例如,我想在客户端上写这样的东西:
main= putStrLn $ show $ add 2 3
Run Code Online (Sandbox Code Playgroud)
这样add函数就可以在服务器上执行了.
Yesod/Snap/Servant
在客户端上使用服务器和GHCJS 进行此操作的最简单方法是什么?
2)同样,我想写一个"功能":
getPhaseOfMoon :: IO Phase
它在服务器上运行,我想以getPhaseOfMoon
类型安全的方式从客户端调用.
所以我可以在客户端上写这个:
main= do
p<-getPhaseOfMoon
putStrLn $ show p
return ()
Run Code Online (Sandbox Code Playgroud)
Phase
客户端我怎么能用Yesod/Snap/Servant
(服务器)+ GHCJS(客户端)做到这一点?
OverloadedStrings
扩展非常有用,但它有一些缺点.请考虑以下函数定义:
someFunction :: ToJSSTring a => a -> IO ()
someFunction = js_function . toJSSTring
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果我想传递一个文字值,我必须在OverloadedStrings
启用时显式添加一个类型签名:
someFunction ("This is plain string" :: String)
someFunction ("And this one is Text" :: Data.Text.Text)
Run Code Online (Sandbox Code Playgroud)
这种必要性的原因是非常明显的,我想这OverloadedStrings
是为了简化文字值传递给具有严格类型签名的函数,使开发人员无需在pack
任何Text
需要值的地方编写代码.
问题是,有没有办法,默认所有没有类型签名的字符串文字Text
,或String
?或者我应该将我的代码拆分为一般函数(使用ToJSString
类型约束)和任意函数,它们的参数具有严格的类型签名?
Java 8有一个名为Nashorn的内置JavaScript引擎,因此实际上可以在JVM上运行编译为JavaScript的Haskell.
以下程序有效:
{-# LANGUAGE JavaScriptFFI #-}
module Main where
foreign import javascript unsafe "console={log: function(s) { java.lang.System.out.print(s); }}"
setupConsole :: IO ()
foreign import javascript unsafe "java.lang.System.exit($1)"
sysexit :: Int -> IO ()
main = do
setupConsole
putStrLn "Hello from Haskell!"
sysexit 0
Run Code Online (Sandbox Code Playgroud)
我们可以运行它:( 旁注:可以将它作为普通的Java程序运行.jjs
只是在JVM上运行纯JavaScript代码的便捷方式)
$ ghcjs -o Main Main.hs
[1 of 1] Compiling Main ( Main.hs, Main.js_o )
Linking Main.jsexe (Main)
$ which jjs
~/bin/jdk/bin/jjs
$ jjs Main.jsexe/all.js
Hello from Haskell!
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,console.log
需要使用java.lang.System.print …
我想创建一个Behavior t a
来自一个IO a
预期的语义,每次行为是sample
d 时都会运行IO动作:
{- language FlexibleContexts #-}
import Reflex.Dom
import Control.Monad.Trans
onDemand :: (MonadWidget t m, MonadIO (PullM t)) => IO a -> m (Behavior t a)
Run Code Online (Sandbox Code Playgroud)
我希望我可以只执行这样做measurement
的pull
:
onDemand measure = return $ pull (liftIO measure)
Run Code Online (Sandbox Code Playgroud)
但是,在Behavior
初始化之后,结果永远不会改变measure
.
我可以想到的解决方法是创建一个Behavior
"频繁"更改的虚拟对象,然后创建一个假依赖:
import Data.Time.Clock as Time
hold_ :: (MonadHold t m, Reflex t) => Event t a -> m (Behavior t ())
hold_ = hold () …
Run Code Online (Sandbox Code Playgroud) 我想知道目前是否可以使用Helm或通过GHCJS在浏览器上运行的任何其他引擎在Haskell中编写游戏?