小编nlu*_*oni的帖子

如何在OCaml中退出迭代?

我尝试去通过列表xlList.fold_left,我想退出迭代时,一些条件得到满足:

List.fold_left
  (fun x acc -> 
     if x = 5 then STOP THE ITERATION
     else x + acc)
xl
Run Code Online (Sandbox Code Playgroud)

谁能告诉我如何在STOP THE ITERATION这里表达?谢谢

编辑1:根据上面的代码,我想说我们不会停止累积,直到我们遇到第一个5.

iteration ocaml

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

OCaml:从函数创建记录

type node = {
  lan: string;
  lat: string;
};;

let rec read_nodes_from_list list = match list with
  | Xml.Element("node", _, _)::list' -> {lan="A"; lat="B"}::read_nodes_from_list list'
;;
Run Code Online (Sandbox Code Playgroud)

我试过这个来创建一个节点记录,但它不起作用.假设我有另一种类型具有相同属性的节点,如何告诉ocaml要创建哪种类型的对象?

谢谢.

ocaml

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

Bit Twiddle执行此转换

好奇,如果有人可能对如何对二进制数进行以下操作有一些见解:

兑换

   01+0 -> 10+1 (+ as in regular expressions, one or more)
    01 -> 10  
    10 -> 01  
Run Code Online (Sandbox Code Playgroud)

所以,

10101000010100011100
01010100101010100010
Run Code Online (Sandbox Code Playgroud)

并澄清这不是一个简单的反转:

000000100000000000
000001010000000000
Run Code Online (Sandbox Code Playgroud)

我正在考虑正则表达式,但我正在使用二进制数,并希望保持这种状态.这个讨厌的黑客页面也没有给我任何见解.这显然具有细胞自动机的一些本质.那么,任何人都有一些可以解决这个问题的操作吗?(不需要代码,我知道该怎么做).

bits bit-manipulation

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

ocaml eval函数来自类型define

我有以下定义类型,并尝试评估该函数作为示例:

let evn =[("z1",Int 0);("x",Int 1);("y",Int 2);("z",Int 3);("z1",Int 4)];; 
val evn : (string * Nano.value) list = [("z1", Int 0); ("x", Int 1); ("y", Int 2); ("z", Int 3); ("z1", Int 4)] 
# let e1 =Bin(Bin(Var "x",Plus,Var "y"), Minus, Bin(Var "z",Plus,Var "z1"));; 
val e1 : Nano.expr = Bin (Bin (Var "x", Plus, Var "y"), Minus, Bin (Var "z", Plus, Var "z1")) 
# eval (evn,e1);;
- : Nano.value = Int 0 
# eval (evn,Var "p");;
Exception: Nano.MLFailure "Variable not bound: p". …
Run Code Online (Sandbox Code Playgroud)

ocaml eval

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

如何在OCaml中汇总浮点数列表

我对我的代码感到困惑:

let sum l = match l with
  | [] -> 0.0
  | h::t -> h +. (sum t);;
Run Code Online (Sandbox Code Playgroud)

它应该给我列表中的数字总和.但是,当我检查代码时,我发现第二个代码在使用长度大于或等于7的列表时崩溃.这是代码:

# sum [0.;1.;2.;3.;4.;5.;]

- : float = 15.

# sum [0.;1.;2.;3.;4.;5.;6.]

- : float = 21.
# sum [0.;1.;2.;3.;4.;5.;6.;7.]

- : float = 21.
Run Code Online (Sandbox Code Playgroud)

我真的很困惑,因为对int进行操作的修改结果是正常的:

let rec sumf l = match l with
  | []-> 0.0
  | h::t-> (float_of_int h) +. sumf t;;
Run Code Online (Sandbox Code Playgroud)

除了我在第二个代码中将int转换为float之外,我不知道两者之间的本质区别是什么.

ocaml

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

我无法在树中构建元素列表

我将树类型定义为

type 'a tree = Nil | Node of ('a tree * 'a * 'a tree)
Run Code Online (Sandbox Code Playgroud)

我需要在这个树中构建一个元素列表.我试过(没有尾递归):

let elements t =
  let rec walk node =
    match node with
    | Nil -> []
    | Node(lChild, x, rChild) ->
      (walk lChild) :: [x] :: (walk rChild)
  in
  walk set
Run Code Online (Sandbox Code Playgroud)

但是我得到一个类型错误:表达式(walk lChild)有类型'a list但是表达式需要类型'a

所以我想我的问题可以简化为"如何将一个元素列表添加到列表中".

谢谢!

ocaml list

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

标签 统计

ocaml ×5

bit-manipulation ×1

bits ×1

eval ×1

iteration ×1

list ×1