只是一个简单的问题.我想知道在标准库(或在Jane Street的核心或电池中)中定义的OCaml中是否存在中缀函数组合运算符,就像Haskell中的(.)函数一样,它为我们节省了很多括号,因为我们可以编写(f . g . h) x而不是不太吸引人f (g (h x))).
谢谢大家.
根据Real World OCaml,"abc"应该是这种类型string.但实际上在我的utopREPL中,它的类型bytes.
我已经打开了Core.Std.这是为什么?
(版本OCaml是4.02.2; Core是112.24.01; utop是1.18.)
我是OCaml的新手,我经常建议我使用Jane Street的标准库而不是编译器附带的标准库.
然而,似乎有甚至几个的那些,我不知道我应该使用:
任何人都可以快速总结一下这些(也许与电池等)之间的区别,或者何时以及为什么我应该选择其中一个?
今天,我经历的源代码简街的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是需要的功能的功能f和g作为参数和返回功能fun x …
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
产生一个只返回其第一个参数的函数
我真的不明白.
();第一?let const c = fun () -> c?这将给出一个函数unit作为参数并始终返回初始值c.let f = const 5,f将成为一个以'_a参数为参数的函数.返回具有弱多态参数的函数的目的是什么?ps我看到Fn模块里面的几个函数都有();返回函数之前的用法是();什么?
$ 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) 当我尝试打电话#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以及重新安装core和utop,但这个错误仍然存在.是否有可能我还需要重新安装opam?我目前正在使用opam-1.2.2的二进制版本.
我正在运行Arch Linux,我相信在更新系统上的所有软件包之后会出现这个错误,但我不确定.
我仍然可以用来jbuilder构建可执行文件,但是在运行可执行文件时,它们会因类似的错误而失败:
$ _build/install/default/bin/my_executable
Uncaught …Run Code Online (Sandbox Code Playgroud) 我有简单的程序,它使用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)
我究竟做错了什么?
我有一个程序使用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文件的顶部?如果我这样做,就需要改变很多东西.
AFAIK,OCaml 中的字符串只是简单的字节序列。他们没有编码的概念。
\n\n这对于大多数用途来说都很好。然而,标准库的某些部分对以单字节字符集编码的字符串做出了假设,例如以下的对齐功能printf:
# printf "[%4s]\\n[%4s]\\n" "a" "\xc3\xa0";;\n[ a]\n[ \xc3\xa0]\n- : unit = ()\nRun Code Online (Sandbox Code Playgroud)\n\n是否有升级的printf地方可以正确处理这个问题,例如通过查看 LANG 和 LC_* 来猜测终端上使用的编码?(我正在使用核心)
我在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)
是否有更好的方法可以防止代码重复?
我正在研究 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 ×13
ocaml-core ×13
haskell ×1
install ×1
ocaml-dune ×1
opam ×1
printf ×1
reason ×1
utf-8 ×1
utop ×1