小编Tho*_*mas的帖子

OCaml Websocket示例

我不确定如何充分使用OCaml Websocket库.我希望有人可以通过一个简单的例子来帮助我.我试图在websocket.org上测试库.我只是想发送一条消息,然后打印响应.我很困惑如何使用/访问返回的函数ws_conn.我以为我可以做类似的事情let push,print = ws_conn in,let push,print = Websocket.open_connection ~tls:false ws_addr in但这似乎不正确.这是我到目前为止所拥有的.

    #require "websocket";;

    (* Set up the websocket uri address *)
    let ws_addr = Uri.of_string "ws://echo.websocket.org"

    (* Set up the websocket connection *)
    let ws_conn = Websocket.open_connection ~tls:false ws_addr

    (* Set up a frame *)
    let ws_frame = Websocket.Frame.of_string "Rock it with HTML5 WebSocket"

    (* Function to handle replies *)
    let with_reply s =
      match s with
      | Some x ->
          let line …
Run Code Online (Sandbox Code Playgroud)

ocaml websocket

5
推荐指数
2
解决办法
1704
查看次数

OCaml AST记录类型表示

我正在尝试了解有关OCaml扩展点的更多信息,并且我无法跟踪AST中记录类型的表示.

我在这篇博客文章中窃取了以下示例:

http://whitequark.org/blog/2014/04/16/a-guide-to-extension-points-in-ocaml/

使用源文件(foo.ml):

 let _ = [%getenv "USER"]
Run Code Online (Sandbox Code Playgroud)

并输出ocamlc -dparsetree fool.ml:

 [
   structure_item (test.ml[1,0+0]..[1,0+24])
     Pstr_eval
     expression (test.ml[1,0+8]..[1,0+24])
       Pexp_extension "getenv"
         [
           structure_item (test.ml[1,0+17]..[1,0+23])
             Pstr_eval
             expression (test.ml[1,0+17]..[1,0+23])
               Pexp_constant Const_string("USER",None)
         ]
  ]  
Run Code Online (Sandbox Code Playgroud)

从asttypes.mli和parsetree.mli我可以遵循该行的解析树模式匹配

 Pexp_constant Const_string("USER",None)
Run Code Online (Sandbox Code Playgroud)

但是,当解析树表示记录类型时,我无法再跟踪发生的情况.似乎记录字段的表示顺序与它们在类型定义中出现的顺序不同,并且解析树中不需要(或显示)所有字段.

来自parsetree.mli:

 type expression = {
   pexp_desc: expression_desc;
   pexp_loc: Location.t;
   pexp_attributes: attributes;
 }
Run Code Online (Sandbox Code Playgroud)

解析树输出似乎只显示位置和有效负载,但我可能读错了.

如何正确读取记录类型的AST?对于类型表达式应该是:

 (* record type declaration and pexp_loc field *)
 expression (test.ml[1,0+8]..[1,0+24]) 
   (* pexp_desc field *)
   Pexp_extension "getenv"
     [
       ...
     ]
Run Code Online (Sandbox Code Playgroud)

ocaml abstract-syntax-tree

5
推荐指数
1
解决办法
442
查看次数

opam安装cryptokit失败

我以前通过opam安装任何OCaml软件包都没有问题.但是我无法安装Cryptokit.

我正在使用命令:

    $ opam install cryptokit
Run Code Online (Sandbox Code Playgroud)

并且我收到以下错误消息(我不确定它们的含义,并且找不到有关错误的任何文档):

[ERROR] The compilation of cryptokit.1.9 failed.
Removing cryptokit.1.9.
  ocamlfind remove cryptokit


===== ERROR while installing cryptokit.1.9 =====
# opam-version 1.1.0
# os           linux
# command      make
# path         /home/alpha/.opam/system/build/cryptokit.1.9
# compiler     system (4.01.0)
# exit-code    2
# env-file     /home/alpha/.opam/system/build/cryptokit.1.9/cryptokit-9111-ffb3fd.env
# stdout-file  /home/alpha/.opam/system/build/cryptokit.1.9/cryptokit-9111-ffb3fd.out
# stderr-file  /home/alpha/.opam/system/build/cryptokit.1.9/cryptokit-9111-ffb3fd.err
### stdout ###
# ...[truncated]
# mv stubs-md5.o src/stubs-md5.o
# ocamlfind ocamlc -ccopt -O -ccopt -DHAVE_ZLIB -c src/stubs-misc.c
# mv stubs-misc.o src/stubs-misc.o
# ocamlfind ocamlc -ccopt -O -ccopt …
Run Code Online (Sandbox Code Playgroud)

ocaml opam

3
推荐指数
1
解决办法
1084
查看次数

如何使用 OCaml Url 和 Cohttp

我正在尝试使用 OCaml 的 Url 和 Cohttp 模块来访问 API 并检索 JSON 数据。我不想以异步方式执行此操作。我没有网络/网络编程经验,所有模块文档都只是提供类型和方法的签名(对我没有太大帮助,因为我不知道它们是做什么的)。我正在尝试访问 bitstamp API 并检索比特币的出价。到目前为止我只知道如何声明一个URI

    let bitstamp_uri = Uri.of_string "http://www.bitstamp.net/api/ticker/";;
Run Code Online (Sandbox Code Playgroud)

但我现在知道如何调用 uri 来检索 json 数据。我如何使用现有的库来实现这一目标?我已经知道如何将 json 数据解析为我需要的类型。

api url json ocaml http

2
推荐指数
1
解决办法
2938
查看次数

有一个工作的OCaml IDE吗?

我已经下载了多个OCaml IDE /插件,其中没有一个可以工作.如果我有目录问题或者其他问题出错,我不知道.我可以通过cygwin访问OCaml控制台,但它对于处理较大的文件并不是很有用.我是一个完整的OCaml菜鸟,不知道如何解决我的问题.我一直在阅读OCaml上的每一篇文章,没有任何帮助.我希望有人可以帮助我,因为这非常令人沮丧!感谢所有回复的人.

ide ocaml

0
推荐指数
1
解决办法
1840
查看次数

Lwt和递归函数

可以使用Lwt.return作为递归函数的最终调用吗?

我有一个编译正常但功能不正常的函数,它看起来像f下面的函数.请假设g在此示例中提供的任何功能都没有问题,我基本上只是试图找出是否可以使用以下形式的函数,或者是否有更好/更简单(和Lwt兼容)的方式做以下事情:

 let rec f (x : string list) (g : string -> unit Lwt.t) =
   match List.length x with
   | 0 -> Lwt.return ()
   | _ -> g (List.hd x) >>= fun () -> f (List.tl x) g
 ;;
 val f : string list -> (string -> unit Lwt.t) -> unit Lwt.t = <fun>  
Run Code Online (Sandbox Code Playgroud)

我很确定我做错了.但是我使用的实际功能比这个例子复杂得多,所以我很难调试它.

ocaml tail-recursion ocsigen ocaml-lwt

0
推荐指数
1
解决办法
367
查看次数