我对OCaml中的内存管理很好奇。当通过程序调用共享列表时。例如:
let rec insertAux v acc l =
match l with
| [] -> acc
| h::t -> insertAux v ((v::h) :: acc) t;;
let insert v l = insertAux v l l;;
let rec sublist l =
match l with
| [] -> [[]]
| head::tail -> insert head (sublist tail);;
在insertAux中
以下代码片段来自官方的OCaml :
# let rec compress = function
| a :: (b :: _ as t) -> if a = b then compress t else a :: compress t
| smaller -> smaller;;
val compress : 'a list -> 'a list = <fun>
上面的函数用连续的、重复的元素“压缩”列表,例如:
# compress ["a";"a";"a";"a";"b&
我的目标是计算浮动列表的平均值。但是,可能会出现列表为空的情况,因此计算量将为0。/。0。= nan,但在这种情况下,我想返回0。而不是南。我的代码如下所示:
let avg lst =
(*computation of sum of the list through the length of it *)
try sum lst /. length lst
with
| Not_found -> 0.0
| nan -> 0.
但是我的第二个用例被编译器看作是变量,而不是nan。如何在try/with块中检查nan?
在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携带,并且类型匹
我刚接触OCaml,刚刚找到一个在线的OCaml指南,。当讲到第五课时,我陷入了一些练习。所以,这就是问题所在:修复所有这些let表达式,以便最终获得预期的结果:
1.
let xy =
let x = 'x' and let y = 'y' in x ::[y]
2.
let ab =
let a = 'a'
let b = 'B' in Char.lowercase b
in a ::[b]
3.
let up = Char.uppercase in
big_xy = List.map up xy ;
我在Ocaml中有一个简单的代码,描述如下:
for i = 1 to 9 do
for j = 1 to 9 do
let k = i*10+j
Format. printf "(define x%d :: int)@." k
done;
print_newline ()
done
但是它会导致语法错误,我不知道为什么:
File "main.ml", line 5, characters 2-6: Error: Syntax error --> Line 5: done;
请帮我修一下,给我推荐一本好书来学习奥卡姆。我是个新
我有一个函数numofday,我想将其应用于另一个函数中的两个变量,该函数将返回两个给定天数之间的天数,函数本身并不重要,我想这更多的是一个语法问题,但google并没有产生太多。
我想要做的事情是这样的(这就是我尝试的方法,显然不起作用)
let daysbetween day1 day2 =
let x = numofday day1;
let y = numofday day2;
x-y;;
我试着去掉let,去掉分号,用:=代替=,但我似乎就是不能让它工作。必须有一种方法来定义函数中的变量。提前谢谢。
尝试编译以下表达式时: String.blit (String.make tfs.len ' ') 0 tfs.txt 0 tfs.len; 编译器报告以下错误: Error: This expression has type string but an expression was expected of type bytes
and the variable 'tfs.txt' (of type string) is pointed at. 根据一些论坛中的建议,我尝试将变量OCAMLPARAM设置为值:safe_string=0,_,但没有结果 我在Ub
我正在用OCaml编写一个函数,该函数使用类型选项并使用List.fold_right返回列表中最长的列表。
let longest (lst : 'a list list) : 'a list option =
List.fold_right (fun (i : 'a list) (y : 'a list option) -> if List.length i > List.length y then (Some i) y else y) lst None
但是,我一直收到以下错误。
This expression has type
我写了下面的代码,从列表中随机选择n个项目,并将选择的项目放在一个新的列表中,代码如下
let random_extract list n =
let l = ((List.length list)- 1)
and acc = [] in
for i = 1 to n do
(List.nth list (Random.int l) ) :: acc (* Line 447 *)
done;
acc
;;
当我加载包含此代码的文件时,我得到以下错误
File "all_code.ml", line 447, ch
(* function for union of two ordered sets*)
let rec search n list1 = match list1 with
[] -> false
| head :: tail when head = n -> true
| head :: tail when head != n -> search n tail
;;
(* function calls and output *)
Printf.printf("\nList = {");;
open Printf
let list1=[
我现在正在学习OCaml,在我做完这些之后,
type aexp =
| Const of int
| Var of string
| Power of string * int
| Times of aexp list
| Sum of aexp list
let rec diff : aexp * string -> aexp
=fun (aexp,x) -> match aexp with
|Const a -> Const 0
|Var "x" -> Const 1
|Power ("x", a) -> (match a
我有一个问题要让if true then x else y的环境不是封闭的,封闭的,不是好类型的,是封闭的,也是好类型的。我如何在OCaml中做到这一点?
我所知道的是,不封闭意味着有一个变量不受约束。所以x和y在这种情况下是不受约束的。此外,良好的类型意味着表达式满足语法。
我不知道如何在这里应用,但我只有非常错误的答案。也许是这样:
if (x:int, y:int) then (true) else (false)
if (x:int, y: int) then (x: bool) else (y: bool)
if (true) then (x: int) else (y: int
我试图使用OCaml在MinGW上构建LLVM CMake绑定。我对绑定目录中的LLVMBuild.txt做了一些调整,但没有成功。我该如何建造它们?
编辑:回答ygrek的问题:
第一次尝试:
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
cd ../projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk com
我是OCaml的新手。我正在处理一个具有以下自定义类型的项目:
type ('a, 'b) holder = 'a * 'a * 'b option
我正在尝试将一个函数折叠到一个持有者列表上,但是我不知道如何对match>进行模式转换,我需要能够访问持有者中的值。我试过了:
match currently_holder with
|[] -> acc
|(a0, a1, b0) -> a1::acc
我很感谢你的帮助。如上所述,我非常缺乏经验,并且刚刚开始使用自定义类型。谢谢!
我写了一个在列表的第n位插入整数的函数,我最初写道
let rec insert x n l =
match l with
|[] -> [x]
| h:: t -> if n = 0 then x :: l else h :: insert x (n-1) t
当我试图在列表的末尾添加一个整数时,这会抛出一个错误。
let rec insert x n l =
match l with
|[] -> [x]
|h :: t as l -> if n = 0 then x :: l else h :: insert x (n-1) t
_
我正在遵循OCaml的入门指南,我正在开发的一个程序不起作用,我想知道是否可以得到一个解释。
let profit_500 : int =
let price = 500 in
let attendees = 120 in
let revenue = price * attendees in
let cost = 18000 + 4 * attendees in
revenue - cost;;
let test () : bool =
(profitTest 500) = profit_500
;; run_test "profit
我正在迭代一个节点列表,以便在它们之间创建边,但是我想检查两个节点之间的边是否跨越了一个“危险”位置,所以我创建了一个函数,作为谓词,以确保我不会创建这样的边。然而,我不知道如何才能正确地构建我的边缘列表。
所操纵的类型如下:
type position = float * float
type node = position
type edge = position * position * float
我写了这个,它不起作用,但这是我的想法,我不知道我可以用什么在OCaml使它工作
let create_edges nodes_list =
let rec create_edges_a
以let f x = f x in f 1为例。是否定义了它的签名?
如果有,是什么?有人可能会争辩说,OCaml不知道它没有终止,它的类型只是被推断为'a。对吗?
let a b = let rec f x = f x in f 1;;
例如val a : 'a -> 'b,尽管很明显,当应用a时,将不会有'b
我最近写了一些Haskell代码,它从不终止。在仔细检查了我的代码之后,问题归结为下面的代码片段
main :: IO ()
main = print $ let a = 10 in
let a = a in
a :: Int
我想这肯定与Haskell的懒惰有关,因为相同的代码在OCaml中终止。但是,如果我编写了下面的代码而不是
main :: IO ()
main = print $ let a = 10 in
let b = a in
b :: Int
代码完全不会有
我一直在试着在Ocaml的名单上找到最后一个项目。这就是我试过的。
let last2 (xs:'a list) : 'a =
List.fold_left (fun acc element -> let acc=element) acc xs;;
但没起作用。我的想法是acc将成为元素,直到列表中的最后一项。在到达列表末尾后返回acc,将给出列表中的最后一项。
有人能帮忙吗?提前谢谢。
编辑:我正在接近以下几点
let last2 (xs:'a list) : 'a =
List.fold_left (fun a b -> b)
我正在尝试使用OCaml类型声明来实现循环双向链表。这就是我所拥有的: type 'a cList =
{
mutable value : 'a;
mutable left : 'a cList option;
mutable right : 'a cList option
}
;; 当我需要声明包含单个元素的第一个列表时,问题就出现了。因为元素在赋值之前不能被引用,所以我不能让单元格的左侧和右侧成员指向其自身。到目前为止,我唯一的解决办法是允许left和right成员的类型为option,将它们设置为None,然后修改它们,使其指向单元格本身。 l