我感兴趣的是在大图像类型的层次结构中定义一个原始类型(颜色通道)。由于所讨论的类型代表了一点,因此将其可能的值限制在0到255范围内的整数似乎是合理的。但是,我不知道在类型级别实现这样的约束是否是OCaml的类型系统中通常所做的事情。
type channel = int (* restrict to range 0 -> 255 *)
如果这样做在OCaml类型系统中是合法的,那么应该如何在类型级别上定义对整数集的约束呢?更具体地说,如何将类型定义为整数的子集(范围)?
在处理ocaml项目时,我发现了一些我不太理解的东西。
假设我同时使用了OCaml标准库的Array和List模块。它们都实现了函数length,但具有不同的类型。在List模块中,其类型如下:
length: a' list -> int
在Array模块中,它的类型是:
length: a' array -> int
但是,我希望您通过open关键字在我实现的同一个模块中使用这两个模块:
open List
open Array
当我试图在列表上使用length函数时,我在编译过程中遇到了类型错误。
由于OCaml是一种强静态类型的语言,我想知道为什么编译器不知
目前,我正在为一个编程语言类教自己ocaml,并且我试图弄清楚如何将函数参数和返回类型指定为List。
我创建了一个程序,通过char读取文件char将每个char存储在List中,反转列表,然后返回List。
当前代码:
(*
Creating a function that will read all the chars
in a file passed in from the command argument.
This function takes a parameter of type List.
This function will return a L
我正在尝试生成LLVM ir,并且目前有这样的
let fill_structs = StringMap.iter (fun k v -> L.struct_set_body k v false ) structs
(* more let...in statements *)
我得到的错误信息是我传递给L.struct_set_body的“k”
StringMap.key
This expression has type string but an expression was expected of type
L.lltype
我对ocaml的理解很弱,所以我从中看到struct
在F#程序中,我更喜欢使用
[<RequireQualifiedAccess>]
type MyType =
| FirstOption of string
| SecondOption of int
因此,在使用MyType的代码中,我不得不编写MyType.FirstOption,而不是只编写FirstOption。有什么办法在OCaml中强制这样做吗?
我有一张标签清单:
let tags = ["div", "h1", "p"]
我能否生成一个模块,其中包含以这些标记作为名称的函数?
/*不介意语法,这是Facebook的原因(与ocaml的新接口) */
let module DOM = {
let div props children => Js.Unsafe.fun_call
(Js.Unsafe.get dom (Js.string "div")) [|Js.Unsafe.inject props, Js.Unsafe.inject chil
我混淆了Ocaml中的模块类型。
我想知道在什么情况下应该使用模块类型?
我通常在.mli中使用模块sig来公开一些细节,并在.ml中添加相应的实现模块结构。
例如:
.mli
module A:
sig
type t = T of string
end
.ml
module A =
struct
type t = T of string
end
因此,我认为Ocaml的模块类似于C中的.h和.c文件。
我知道模块类型可以声明一个接口,但是接口是,而不是。
就像书中的一个例子:
open Core.Std
module type ID = sig
type t
我在试着自己去理解,OCaml语言有哪种形式的多态。
我得到了一个例子
let id x = x
这个示例不是等同于C++模板函数吗
template<class A> A id(A x) { return x; }
如果是这样,那么我的问题是: OCaml中是否还有其他形式的多态性?在命令式语言的世界中,这个概念被称为“通用算法”,而不是“多态性”。
我想编写一个模块(在Ocaml 3.12中),它能够将变体类型定义为现有不同类型的聚合
它可以是0到N个类型,所以一个变量列表或集合
看起来可能是这样的:
type newtype = Type0 of type0 | Type1 of type1 | ... | TypeN of typeN
当然,我想要分解它的创建。
首先,我尝试创建一个由函子参数化的模块‘组合’:
module Composite ( T0 : sig type t end ) ( T1 : sig type t end ) =
struct
type t = T0.t | T1.t
end
第一个困难:如何将函子
在模块中,我定义了一个表示图节点的类型,它具有一个多态数据字段,即
type 'a t = {data: 'a; adj: 'a t list}
如何创建这些数据的?我尝试了以下几点(按照的建议之一)。
let cmp (g1:int Graph.t) (g2: int Graph.t) : int=
if phys_equal g1 g2 then
0
else
Int.compare g1.data g2.data
let make_set () =
let module Ord=struct
type t=int Gr
在print_int中有一系列的函数,比如print_endline和Printf。我不能做这样的事
let n = 10 in
print n;; (* And I haven't to change `print` in case type of `n` changed *)
这是多态打印,如Java、C#、Python等。相反,我们有由程序员显式定义的类C类型。所以我认为OCaml在编译过程中丢失了类型信息,并且在运行时没有这些信息,对吗?这也是我们需要mli文件的原因吗?
编辑:,我厌倦了编写像*print_listi*、*print_list_tuple2i*等函数。我怎样才
OCaml新手,在集合方面遇到困难(实际上,是模块类型和函数器)。我想在.mli文件中定义以下内容: type t
type tag
val tags : t -> <set of tag> 其中,类似于tag list,set of tag是我搞不懂的类型。 更新:感谢Jeffrey Scofield在下面的有用评论,但由于我真正的问题仍然没有得到回答,我认为我没有很好地表达出来。这是第二次尝试: 给定此a.ml type tag = string
module TagSet = Set.Make (struct
type t = tag
let compa
有没有一种方法可以参数化类型上的模块,或者在OCaml中从模块中转义类型?基本上,我想编写一些在浮点类型上参数化的例程,并且仍然可以访问(+.)、(-.)等运算符。当然,我们可以像这样编写浮点模块
module type REAL = sig
type t
val real : float->t
val (+.) : t->t->t
val (-.) : t->t->t
val ( *. ) : t->t->t
val (/.) : t->t->t
end
,它对普通浮点数有一个非常基本的实现
很奇怪,这段ocaml代码片段是由toplevel很好地键入的。看看结构,如果g的类型是int->int,如toplevel所示,结构的h x = g x部分将不能获得类型统一。那么有谁能澄清一下吗?
module Mymodule : sig
val h:int ->int
val g: string-> string
end = struct
let g x = x
let h x = g x
end
这是顶层的响应:
module Mymodule : sig val h : int -> int val g : string -> st
在关于如何在OCaml中类型化递归模块的中,写道模块是在由模块类型近似组成的环境中检查的:
module rec A = ... and B = ... and C = ...
首先建立一个环境{A -> approx(A);B -> approx(B);C -> approx(C) },然后用来计算A,B和C的类型。
我注意到,在某些情况下,近似不够好,类型检查失败。特别是,当将编译单元源代码放在递归模块定义中时,类型检查可能会失败,而编译器可以单独编译编译单元。
回到我的第一个示例,我发现一个解决方案是在初始近似环境中使用类型A,然后在使用新的计算类型A扩展的初始环境中使
我在浏览ocaml的标准库时,在map.ml文件中偶然发现了这段代码。
module type S =
sig
type key
type +'a t
val empty: 'a t'
我想知道为什么会有type +'a t,为什么作者使用它而不是简单的'a t。
它的行为很奇怪,我无法推断它的用法。
# type +'a t = 'a list;;
type 'a t = 'a list
# type +'a t = +'a list;;
Characters 13-14:
我试图找出如何根据参数类型的模块编写函数,但在任何地方都找不到类似的东西。我试图尽可能地减少这个问题,最后得到了这个虚拟的例子。
module type Mappable = sig
type 'a t
val map : ('a -> 'b) -> 'a t -> 'b t
end
let plus (type m) (module M : Mappable with type 'a t = 'a m) (xs : int m) =
M.map (fun x -> x + 1) xs
这将产生错误
在Lua中,有一个向函数发送"self“的简短表示法,因此a.withdraw(a, 100.0)可以编写为a:withdraw(100.0)。难道不应该对OCaml做类似的扩展吗,让List.length l像l::map (fun e -> e + 1)一样编写l::length和List.map (fun e -> e + 1) l
我想做这样的事情:
module Make (M: MInt) (N: MInt) : T = struct
(* always defined *)
let foo = 42
(* only defined when M == N or M.x == N.x, something like that *)
let bar a b = a * b
end
这个是可能的吗?
显然,我可以在运行时检查,但我很好奇如何在编译时进行检查。谢谢!