标签: ocaml-core

OCaml中是否有中缀函数组合运算符?

只是一个简单的问题.我想知道在标准库(或在Jane Street的核心或电池中)中定义的OCaml中是否存在中缀函数组合运算符,就像Haskell中的(.)函数一样,它为我们节省了很多括号,因为我们可以编写(f . g . h) x而不是不太吸引人f (g (h x))).

谢谢大家.

ocaml ocaml-batteries ocaml-core

23
推荐指数
4
解决办法
1万
查看次数

为什么我的字符串类型为`bytes`?

根据Real World OCaml,"abc"应该是这种类型string.但实际上在我的utopREPL中,它的类型bytes.

我已经打开了Core.Std.这是为什么?

(版本OCaml4.02.2; Core112.24.01; utop1.18.)

ocaml ocaml-core

12
推荐指数
3
解决办法
3421
查看次数

Jane Street的'Base','Core'和'Core_kernel'有什么区别?

我是OCaml的新手,我经常建议我使用Jane Street的标准库而不是编译器附带的标准库.

然而,似乎有甚至几个的那些,我不知道我应该使用:

任何人都可以快速总结一下这些(也许与电池等)之间的区别,或者何时以及为什么我应该选择其中一个?

ocaml standard-library ocaml-core reason

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

OCaml的参数传递方案中的断点

今天,我经历的源代码简街Core_kernel模块,我碰上了compose功能:

(* The typical use case for these functions is to pass in functional arguments
   and get functions as a result. For this reason, we tell the compiler where
   to insert breakpoints in the argument-passing scheme. *)
let compose f g = (); fun x -> f (g x)
Run Code Online (Sandbox Code Playgroud)

我会将compose函数定义为:

let compose f g x = f (g x)
Run Code Online (Sandbox Code Playgroud)

他们给定义的原因compose,他们做的方式是"因为compose是需要的功能的功能fg作为参数和返回功能fun x …

ocaml haskell ocaml-core

8
推荐指数
1
解决办法
128
查看次数

理解Core的`Fn.const`

Jane Street的Core lib具有以下功能:Fn.const.

https://github.com/janestreet/core_kernel/blob/master/lib/fn.ml

let const c = (); fun _ -> c
Run Code Online (Sandbox Code Playgroud)

val const:'a - >'b - >'a
产生一个只返回其第一个参数的函数

我真的不明白.

  1. 这个功能的目的是什么?在什么情况下我们必须使用它?
  2. 为什么放();第一?
  3. 为什么不把它写成let const c = fun () -> c?这将给出一个函数unit作为参数并始终返回初始值c.
  4. 如果我这样做let f = const 5,f将成为一个以'_a参数为参数的函数.返回具有弱多态参数的函数的目的是什么?

ps我看到Fn模块里面的几个函数都有();返回函数之前的用法是();什么?

ocaml ocaml-core

7
推荐指数
1
解决办法
452
查看次数

如何在(Arch)Linux x86_64上安装OCaml核心库?

$ ocaml -version
The OCaml toplevel, version 4.02.1
$ opam --version
1.2.0
$ opam init 
$ opam install core

#=== ERROR while installing camlp4.4.02.1+system ==============================#
# opam-version 1.2.0
# os           linux
# command      sh ./check-camlp4.sh
# path         /home/john/.opam/system/build/camlp4.4.02.1+system
# compiler     system (4.02.1)
# exit-code    1
# env-file     /home/john/.opam/system/build/camlp4.4.02.1+system/camlp4-32324-f0f09f.env
# stdout-file  /home/john/.opam/system/build/camlp4.4.02.1+system/camlp4-32324-f0f09f.out
# stderr-file  /home/john/.opam/system/build/camlp4.4.02.1+system/camlp4-32324-f0f09f.err
### stdout ###
# ...[truncated]
# 4.02 by switching to a local installation via `opam switch 4.02.1`.
# 
# Here are some installation instructions for camlp4 …
Run Code Online (Sandbox Code Playgroud)

install ocaml ocaml-core

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

在utop中需要"core"会出错:Unix.Unix_error(Unix.ENOENT,"sysconf","")

当我尝试打电话#require "core"utop,我收到一个错误:

utop # #require "core";;
Exception: Unix.Unix_error (Unix.ENOENT, "sysconf", "").
Raised by primitive operation at unknown location
Called from file "toplevel/topdirs.ml", line 144, characters 10-51
Run Code Online (Sandbox Code Playgroud)

我有一个.ocamlinit在我当前目录中看起来像这样的文件:

(* Added by OPAM. *)
let () =
  try Topdirs.dir_directory (Sys.getenv "OCAML_TOPLEVEL_PATH")
  with Not_found -> ()
;;

#use "topfind";;
#thread;;
#camlp4o;;
Run Code Online (Sandbox Code Playgroud)

可能导致此错误发生的原因是什么?它似乎是Findlib的一个错误?

我试图抹着我的~/.opam目录,重新运行opam init,opam switch set 4.05.0以及重新安装coreutop,但这个错误仍然存在.是否有可能我还需要重新安装opam?我目前正在使用opam-1.2.2的二进制版本.

我正在运行Arch Linux,我相信在更新系统上的所有软件包之后会出现这个错误,但我不确定.

我仍然可以用来jbuilder构建可执行文件,但是在运行可执行文件时,它们会因类似的错误而失败:

$ _build/install/default/bin/my_executable
Uncaught …
Run Code Online (Sandbox Code Playgroud)

ocaml opam ocaml-core utop ocaml-dune

5
推荐指数
0
解决办法
446
查看次数

如何将OCaml对象文件与Core模块链接?

我有简单的程序,它使用Core.Std模块中的函数,例如:

open Core.Std
let _ = List.last [1;2;3]
Run Code Online (Sandbox Code Playgroud)

我可以通过ocamlfind或编译和链接它ocamlbuild:

ocamlfind ocamlc -package core -linkpkg -thread app.ml 
ocamlbuild -use-ocamlfind -pkgs core -tag thread app.native
Run Code Online (Sandbox Code Playgroud)

但我不知道如何使用"普通"OCaml编译器编译和链接此类文件:

ocamlc -c -I ~/.opam/system/lib/core_kernel/ -I ~/.opam/system/lib/core/ app.ml 
ocamlc ~/.opam/system/lib/core_kernel/core_kernel.cma ~/.opam/system/lib/core/core.cma app.cmo 
Run Code Online (Sandbox Code Playgroud)

上述命令的最后一行给出以下错误:

File "_none_", line 1:
Error: Error on dynamically loaded library: /home/maciej/.opam/system/lib/stublibs/dllcore_kernel_stubs.so: /home/maciej/.opam/system/lib/stublibs/dllcore_kernel_stubs.so: undefined symbol: caml_ba_alloc
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

ocaml linker-errors ocaml-core

4
推荐指数
1
解决办法
139
查看次数

如何避免在Ocaml中隐藏stdlib模块?

我有一个程序使用BytesOcaml标准库中的Core_kernel.Std模块,并打开文件顶部的模块

open Core_kernel.Std

...

   let let buf = Bytes.make bom_len '\x00' in
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是最新版本的Core_kernel引入了一个新的Bytes模块,该模块隐藏了标准库中的模块,导致Unbound value Bytes.make编译错误.

有没有办法解决这个命名问题,而没有摆脱open文件的顶部?如果我这样做,就需要改变很多东西.

ocaml ocaml-core

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

UTF8 感知 printf?

AFAIK,OCaml 中的字符串只是简单的字节序列。他们没有编码的概念。

\n\n

这对于大多数用途来说都很好。然而,标准库的某些部分对以单字节字符集编码的字符串做出了假设,例如以下的对齐功能printf

\n\n
# printf "[%4s]\\n[%4s]\\n" "a" "\xc3\xa0";;\n[   a]\n[  \xc3\xa0]\n- : unit = ()\n
Run Code Online (Sandbox Code Playgroud)\n\n

是否有升级的printf地方可以正确处理这个问题,例如通过查看 LANG 和 LC_* 来猜测终端上使用的编码?(我正在使用核心)

\n

printf ocaml utf-8 ocaml-core

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

Core_kernel.Heap 和 Core_kernel.FHeap 有什么区别?

Jane Street 的 Core_kernel 库有两个基于配对堆的堆实现:

模块 Core_kernel.Heap

基于配对堆的堆实现。

文档

模块 Core_kernel.Fheap

功能堆(实现为配对堆)。

文档

从描述中,我不清楚它们之间有什么区别。我什么时候会使用其中一种?

ocaml ocaml-core

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

在OCaml中动态切换模块

我在OCaml中有一个模块,由另一个模块参数化,它代表一个数据结构(H = Hashtable,M = Map,L = LossyMap).我现在想通过命令行选择这个数据结构.

我创建主要处理模块的方式是:

module HashSampler = MakeSampler(HashtableMatrix)
module MapSampler = MakeSampler(MapMatrix)

etc.
Run Code Online (Sandbox Code Playgroud)

不幸的是,在这些之间多路复用的代码是丑陋的:

match representation with
| "Hashtable" ->
       let matrix = HashSampler.create () in
           HashSampler.process_file matrix file
| "Map" -> 
       let matrix = MapSampler.create () in
           MapSampler.process_file matrix file
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法可以防止代码重复?

ocaml ocaml-core

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

为什么 OCaml 认为该函数采用 int 参数,而没有任何迹象表明应该如此?

我正在研究 Andrew Appel 撰写的《ML 中的现代编译器实现》的第 1 章,我决定用 OCaml 而不是 SML 来实现它。我是 OCaml 新手,遇到了一个非常令人沮丧的问题。OCaml 似乎认为下面的函数具有签名int * (int * 'a) -> 'a option

let rec lookupTable = function
  | name, (i, v) :: _ when name = i -> Some v
  | name, (_, _) :: rest -> lookupTable (name, rest)
  | _, [] -> None
Run Code Online (Sandbox Code Playgroud)

但据我所知,应该没有任何迹象表明元组中的第一个元素是 int。这是一个问题,因为当lookupTable函数运行时,编译器会抱怨我没有向它传递一个整数。也许我错过了一些非常明显的东西,但它非常令人难以置信。这是程序的其余部分

open Base

type id = string
type binop = Plus | Minus | Times | Div

type stm =
  | …
Run Code Online (Sandbox Code Playgroud)

ocaml ocaml-core

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