Ocaml简介

Ocaml简介,ocaml,Ocaml,我现在正试图学习ocaml,想从一个小程序开始,生成所有位组合: ["0","0","0"] ["0","0","1"] ["0","1","0"] ... 等等 我的想法是以下代码: let rec bitstr length list = if length = 0 then list else begin bitstr (length-1)("0"::list); bitstr (length-1)("1"::list); end;; 但我得到了以下错

我现在正试图学习ocaml,想从一个小程序开始,生成所有位组合: ["0","0","0"] ["0","0","1"] ["0","1","0"] ... 等等

我的想法是以下代码:

let rec bitstr length list =
  if length = 0 then
    list
  else begin
    bitstr (length-1)("0"::list);
    bitstr (length-1)("1"::list);
  end;;
但我得到了以下错误:

Warning S: this expression should have type unit.
val bitstr : int -> string list -> string list = <fun>
# bitstr 3 [];;
- : string list = ["1"; "1"; "1"]
警告S:此表达式应具有类型unit。
val bitstr:int->string list->string list=
#bitstr 3[];;
-:字符串列表=[“1”;“1”;“1”]
我不知道该换什么,你能帮我吗

致意
飞利浦

beginfoo;bar end
执行
foo
并丢弃结果,然后执行bar。因为这只有在
foo
有副作用并且没有有意义的返回值时才有意义,如果foo的返回值不是unit,ocaml就会发出警告,因为其他一切都可能是程序员错误(即程序员实际上并不打算丢弃结果)——这里就是这样

在这种情况下,用“0”计算列表并将其丢弃是毫无意义的。您可能希望将这两个列表连接起来。您可以使用
@
运算符执行此操作:

let rec bitstr length list =
  if length = 0 then
    [list]
  else
    bitstr (length-1)("0"::list) @ bitstr (length-1)("1"::list);;

请注意,我还制作了
length=0
案例返回
[list]
,而不仅仅是
list
,因此结果是一个列表列表,而不是一个平面列表。

虽然sepp2k的答案很正确,但我想添加以下替代方案(与您提出的签名不匹配,但实际上符合您的要求):

第一个区别是,调用函数
bitsr2
返回
[[0];[0];[0];[1];[1];[0];[1];[1];[1];[1];[1]。
。其次,它返回一个有序二进制值列表。但更重要的是,在我看来,它更接近ocaml的精神

我喜欢得到其他的想法

所以它在这里

让rec gen_x acc e1 e2 n=与n匹配
|0->acc
|n->(
让l=List.map(funx->e1::x)acc进入
让r=List.map(funx->e2::x)acc进入
GENU x(l@r)e1 e2(n-1)
);;
让rec gen_string=gen_x[[]]0“1”
设rec gen_int=gen_x[]]0 1
gen_字符串2
总务2
结果:

[["0"; "0"]; ["0"; "1"]; ["1"; "0"]; ["1"; "1"]]

[[0; 0]; [0; 1]; [1; 0]; [1; 1]]

啊,我明白了,谢谢你的解释!你真的帮了我!谢谢你的回复。我喜欢得到其他的想法!因为我不熟悉Ocaml,所以这个解决方案要复杂得多。过几天我会给它一个机会;)
[["0"; "0"]; ["0"; "1"]; ["1"; "0"]; ["1"; "1"]]

[[0; 0]; [0; 1]; [1; 0]; [1; 1]]