我定义了一些类型:
type box = Box of int
type table = Table of int
type compare_result = Lt | Eq | Gt
似乎在OCaml中,我们不能定义两个同名但参数类型不同的函数:
let compare (a: box) (b: box): compare_result = (...)
let compare (a: table) (b: table): compare_result = (...)
let res_box = compare (Box 1) (Box 2) in (* which is supposed
我想定义一个类型,这样所有的构造都可以通过模块成员,可以保留不变量,但允许解构模式匹配。
我只是在学习OCaml,但是下面的方法几乎适用于整数对,不变量是左边应该严格小于右边
module Range : sig
type t = private { left:int; right:int }
exception InvalidRange of (int*int)
val make : int -> int -> t
end = struct
type t = { left:int; right:int }
exception InvalidRange of (
当我学习OCaml要点时,有人告诉我,OCaml中的每个函数实际上都是一个只有一个参数的函数。多参数函数实际上是一个函数,它接受一个参数,并返回一个函数,该函数接受下一个参数并返回.
这是赛跑,我知道了。
,所以我的问题是
案例1
如果我做了
let plus x y = x + y
在OCaml内部,当它编译时,OCaml是否会将它更改为let plus = fun x -> fun y -> x + y
或者相反的情况
案例2
如果我做了
let plus = fun x -> fun y -> x + y
OCaml将把它转换为let plus x y = x
嗨,我一直在互联网上检查,以找到一种在OCaml中实现“字符串是否以特定文本结尾”的好方法,我发现在OCaml中操作字符串并不像我预期的那样简单。
下面是我的OCaml代码,它使用Str.regexp检查文件名称是否以".ml“结尾,以查看它是否是OCaml脚本文件。但是,它并不像我预期的那样起作用:
let r = Str.regexp "*\\.ml" in
if (Str.string_match r file 0)
then
let _ = print_endline ("Read file: "^full_path) in
我想写一个(非常小,很简单-我不知道我在做什么,让我们真实!)OCaml中的编译器。
我非常希望避免将任何ISO代码签入项目(尽管对C相当了解;这里的目标是专门学习和使用OCaml )。根据这一点,我需要用OCaml为编译语言编写一个“运行时”,将其与主项目分开编译,然后将其与编译器本身的输出链接起来。
不幸的是,它看起来像任何外部函数--即使是那些不接触任何OCaml数据的函数--结构/ OCaml堆,预期将使用OCaml的C宏构建:
CAMLprim value scheme_entry(value unit) {
int i;
i = 42;
return Val
在ocaml中,假设我们有:
type t = A of int | B of string
let x = [A 5; B "y"]
然后,我们可以迭代列表,并使用match语句来决定如何处理A或B。
在java中,我们可以有:
ArrayList<Object> x = new ArrayList<Object>();
x.add(new Integer(5));
x.add("y");
在数组列表迭代中,我们必须使用instanceof和downcast来处理数据。
在内部,ocaml是否将运行时类型信息作为java携带,并且类型匹
我编译了一个Haskell源代码包,将FFI实现为一个(.so)动态库。我想在OCaml中调用通过FFI导出的函数。为此,我实现了一个简单的驱动文件,如下所示
open Quelea.Shim
open Ctypes
open PosixTypes
open Foreign
let readEffects =
foreign "readEffects" (ptr char @-> ptr char @-> returning ptr string)
let effects = readEffects "csasc" "saxas
我是第一次探索ReScript。我想使用一个记录类型作为我的键类型来构建一个散列映射,并且我正在寻找关于实现散列函数的指导。 下面是我的ReScript代码: type pointer = { id: string, table: string, spaceId: option<string> }
module PointerHash = Belt.Id.MakeHashable({
type t = pointer
let hash = a => 0 /* How do I implement this? */
let eq = (a, b) =>
最近,我正在读一些有关Haskell的函数式编程书籍。
例如,Haskell似乎很喜欢“模块化程序”,
f :: (Integer,Integer) -> Integer
f = sum . map sq . filter . odd . between
即使相同的函数可以编写成
f' (m, n) = go m
where go m | m > n = 0
| otherwise = go (m + 1) + if odd m then sq m else 0
“融合定律”也很受欢迎和使用()
我不是OCaml专家,但如果可能的话,我会使用
我正在为一些C函数编写OCaml包装器,这些函数使用参数外的成语并返回错误代码。我一直通过在OCaml端使用Ctypes.allocate_n分配一个C数组来包装它们。然后将内容复制到OCaml类型中。
我觉得我正在破解一个Ctypes或其他模块已经以另一种方式解决的问题,下面是一个例子。
gethostname(2)具有以下类型:
int gethostname(char *name, size_t len);
下面是包装好的out_parameter.mli函数的gethostname。
val gethostname : int -> [> `Ok of string | `
我们可以使用包装JS函数,从而在OCaml中调用它。当JS函数是异步的(包括承诺和花费时间)时,我不能做一个工作示例。
我想包装的异步JS函数JSfun如下所示。变量x在2秒后被设置为"here",这是我想返回的值。
function JSfun() {
var x = "before";
return new Promise(function(resolve, reject) {
setTimeout(function() {
append("inside setTimeout");
x = "h
我目前正在努力学习OCaml。我正在搜索与这个python代码相当的代码:
f(*l[:n])
我想我应该尝试编写一个类似于这种行为的函数,但是它不起作用。以下是代码:
let rec arg_supply f xs n =
if n = 0 then
f
else
match xs with
| x :: remainder -> arg_supply (f x) remainder (n - 1);;
下面是我得到的错误信息:
Error: This expression has type 'a but an e
下面的代码在OCaml 3.11中编译得很好:
module type T =
sig
type test
val create : int -> test (* line 44 *)
...
end
...
type test = (string, clause list) Hashtbl.t
let create = Hashtbl.create (* line 332 *)
但是,当我试图用OCaml 4.01编译它时,它会给出以下错误:
Error: Signature mismatch:
...
Values do not matc
在其他语言中,我更喜欢排列源文件,以便在实现细节之前引入更简单和更广泛有用的概念,并在可能的情况下尝试将复杂的实现细节设置为顶层函数,以便将它们分离出来,并让主函数像高级算法描述一样读取。
OCaml显然有接口/源的区别,但是即使有稀疏的文档化的接口,如
type t
(** Blah blah blah *)
val important_operator : t -> t -> t
(** Blah blah blah *)
我很想做这样的事
let rec important_operator a b =
let a', b' = foo a b in
在处理ocaml项目时,我发现了一些我不太理解的东西。
假设我同时使用了OCaml标准库的Array和List模块。它们都实现了函数length,但具有不同的类型。在List模块中,其类型如下:
length: a' list -> int
在Array模块中,它的类型是:
length: a' array -> int
但是,我希望您通过open关键字在我实现的同一个模块中使用这两个模块:
open List
open Array
当我试图在列表上使用length函数时,我在编译过程中遇到了类型错误。
由于OCaml是一种强静态类型的语言,我想知道为什么编译器不知
我在这个模块中有一个模块结构,我声明了一个变量,用于module A中的一些函数。
Module A.
Variable a : nat.
End A.
然后我使用提取机制。
Extraction Language Ocaml.
Set Extraction Optimize.
Set Extraction AccessOpaque.
Extraction A.
或者只是
Extraction A.
它为我生成了带有警告的代码:“以下公理必须在提取的代码中实现:A.”
type nat =
| O
| S of nat
module A =
struct
(**