标签: ghcjs

如何使用GHCJS从Javascript调用Haskell

我一直在玩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主函数.

haskell ghcjs

20
推荐指数
2
解决办法
2363
查看次数

在osx上为GHCJS安装webkitgtk3

我正在尝试在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)

homebrew haskell webkitgtk ghcjs ghcjs-dom

19
推荐指数
1
解决办法
526
查看次数

GHCJS:如何使用FFI导入高阶javascript函数?

如何在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的文档.

谢谢

javascript haskell reactive-extensions-js rxjs ghcjs

18
推荐指数
1
解决办法
1216
查看次数

使用ghcjs将Haskell模块编译为Javascript

是否可以使用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-containersvector实现一些算法,编译成JS,并Elm通过JS FFI使用.

Fay似乎有能力做到这一点.我想首先调查一下ghcjs.

haskell ghcjs

12
推荐指数
1
解决办法
683
查看次数

GHCJS/Haste可以编译自己吗?

如果是这样,那么我可以通过更改其(Haskell)配置让人们玩我的项目:在浏览器中重新编译它,然后在浏览器中重新运行它.我不关心速度.我只是想在浏览器中演示一个难以设置的基础桌面项目.因此,可能的新用户可以在几秒钟内看到他们是否喜欢它,而无需设置.

这将是多么酷!

从我读过的内容来看,GHCJS将STG编译成JavaScript.它说它使用GHC API,所以我们应该能够将它编译成JavaScript,就像任何其他Haskell库一样.(对吗?)虽然GHC运行时有很多C,但编译器本身是纯Haskell吗?

所以:

  1. GHCJS可以将自己编译成JavaScript吗?
  2. Haste可以编译成JavaScript吗?
  3. 其中任何一个都完成了吗?(http://haste-lang.org/try/是如何工作的?似乎需要一个网络.)

haskell ghcjs haste

12
推荐指数
1
解决办法
691
查看次数

键入从GHCJS客户端到Yesod/Snap/Servant的安全RPC调用示例

我有两个关于RPC调用的相关问题Yesod/Snap/Servant:

  1. 假设我在服务器上有一个函数,用Haskell编写,由GHC编译:

    add x y = x+y+42

怎么能:

  1. 我从客户端调用此函数(客户端也是用Haskell编写的,用它编译GHCJS),
  2. 在服务器上执行该功能,
  3. 将结果返回给客户端?

以类型安全的方式做所有这些吗?

例如,我想在客户端上写这样的东西:

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)

哪一个

  1. 去服务器
  2. 服务器参考月相
  3. 服务器返回Phase客户端
  4. 客户端在JavaScript控制台中显示月相.

我怎么能用Yesod/Snap/Servant(服务器)+ GHCJS(客户端)做到这一点?

haskell yesod haskell-snap-framework transpiler ghcjs

12
推荐指数
0
解决办法
454
查看次数

使用重载字符串

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类型约束)和任意函数,它们的参数具有严格的类型签名?

haskell language-extension overloaded-strings ghcjs

11
推荐指数
1
解决办法
3640
查看次数

在JVM上运行编译为JavaScript的Haskell

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 …

haskell ghcjs

11
推荐指数
1
解决办法
378
查看次数

为持续可测量的现象创建行为

我想创建一个Behavior t a来自一个IO a预期的语义,每次行为是sampled 时都会运行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)

我希望我可以只执行这样做measurementpull:

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)

haskell ghcjs reflex

11
推荐指数
1
解决办法
221
查看次数

是否可以在浏览器中运行用Haskell编写的游戏?(通过GHCJS可能?)

我想知道目前是否可以使用Helm或通过GHCJS在浏览器上运行的任何其他引擎在Haskell中编写游戏?

haskell sdl-2 ghcjs kubernetes-helm

10
推荐指数
2
解决办法
1004
查看次数