List OCaml和ReasonML中的不同结果

List OCaml和ReasonML中的不同结果,list,ocaml,reason,bucklescript,List,Ocaml,Reason,Bucklescript,有一种情况是将两个向量映射为一个向量。我希望两个ML的结果应该是相同的。不幸的是,ReasonML的结果是不同的。请帮助并评论如何修复它 OCaml List.map2 (fun x y -> x+y) [1;2;3] [10;20;30];; [11;;22;;33] ReasonML Js.log(List.map2 ( (fun (x,y) => x+y), [1,2,3], [10,20,30])) [11,[22,[33,0]]] 这是同样的结果。如果您运行: Js.l

有一种情况是将两个向量映射为一个向量。我希望两个ML的结果应该是相同的。不幸的是,ReasonML的结果是不同的。请帮助并评论如何修复它

OCaml

List.map2 (fun x y -> x+y) [1;2;3] [10;20;30];;
[11;;22;;33]
ReasonML

Js.log(List.map2 ( (fun (x,y) => x+y), [1,2,3], [10,20,30]))
[11,[22,[33,0]]]

这是同样的结果。如果您运行:

Js.log([11,22,33]);
您将获得:

[11,[22,[33,0]]]

这是同样的结果。如果您运行:

Js.log([11,22,33]);
您将获得:

[11,[22,[33,0]]]

@伊戈尔·卡普科夫,谢谢你的帮助。根据您的评论,我在中发现了一个管道语句,其中有一个摘要

let a = List.map2 ( (fun (x,y) => x+y), [1,2,3], [10,20,30] )
let logl = l => l |> Array.of_list |> Js.log;
a |> logl


[11,22,33]

@伊戈尔·卡普科夫,谢谢你的帮助。根据您的评论,我在中发现了一个管道语句,其中有一个摘要

let a = List.map2 ( (fun (x,y) => x+y), [1,2,3], [10,20,30] )
let logl = l => l |> Array.of_list |> Js.log;
a |> logl


[11,22,33]
结果是相同的,但您使用的打印方法不同。如果不使用
Js.log
而使用
rtop
或,您将获得预期的输出:

- : list(int) = [11, 22, 33]
Js.log
以不同的方式打印它,因为它是绑定到
console.log
的BuckleScript,它将打印您给它的值的JavaScript表示形式。JavaScript中不存在列表,只有数组存在

BuckleScript表示列表的方式与本机实现的方式基本相同。OCaml和Reason中的列表是一个“cons单元格”,它本质上是一个元组或2元素数组,其中第一项是该单元格的值,最后一项是指向下一个单元格的指针。
列表
类型的基本定义如下:

[11,[22,[33,0]]]
 ^   ^   ^  ^
 |   |   |  The Empty list
 |   |   Third value
 |   Second value
 First value
类型列表('a)=
|节点('a,列表('a))
|空的;
根据这一定义,可以用以下内容构建:

Node(11, Node(22, Node(33, Empty)))
这在JavaScript中表示为:

[11,[22,[33,0]]]
 ^   ^   ^  ^
 |   |   |  The Empty list
 |   |   Third value
 |   Second value
 First value
列表是这样定义的,因为不变性使得这种表示非常有效。因为我们可以添加或删除值,而无需将旧列表中的所有项复制到新列表中。要添加项目,我们只需要创建一个新的“cons单元格”。使用具有想象中的不变性的JavaScript表示:

const old=[11,22,33,0]];
新常数=[99,旧];
要从前面移除一个项目,我们不需要创建任何东西。我们只需获取子列表的引用并重用它,因为我们知道它不会改变

const old=[11,22,33,0]];
常数新=旧[1];
列表的缺点是,在末尾添加和删除项目相对昂贵。但在实践中,如果您使用递归以函数的方式构造代码,那么使用该列表将非常自然。而且非常有效。

结果是相同的,但您使用的打印方法不同。如果不使用
Js.log
而使用
rtop
或,您将获得预期的输出:

- : list(int) = [11, 22, 33]
Js.log
以不同的方式打印它,因为它是绑定到
console.log
的BuckleScript,它将打印您给它的值的JavaScript表示形式。JavaScript中不存在列表,只有数组存在

BuckleScript表示列表的方式与本机实现的方式基本相同。OCaml和Reason中的列表是一个“cons单元格”,它本质上是一个元组或2元素数组,其中第一项是该单元格的值,最后一项是指向下一个单元格的指针。
列表
类型的基本定义如下:

[11,[22,[33,0]]]
 ^   ^   ^  ^
 |   |   |  The Empty list
 |   |   Third value
 |   Second value
 First value
类型列表('a)=
|节点('a,列表('a))
|空的;
根据这一定义,可以用以下内容构建:

Node(11, Node(22, Node(33, Empty)))
这在JavaScript中表示为:

[11,[22,[33,0]]]
 ^   ^   ^  ^
 |   |   |  The Empty list
 |   |   Third value
 |   Second value
 First value
列表是这样定义的,因为不变性使得这种表示非常有效。因为我们可以添加或删除值,而无需将旧列表中的所有项复制到新列表中。要添加项目,我们只需要创建一个新的“cons单元格”。使用具有想象中的不变性的JavaScript表示:

const old=[11,22,33,0]];
新常数=[99,旧];
要从前面移除一个项目,我们不需要创建任何东西。我们只需获取子列表的引用并重用它,因为我们知道它不会改变

const old=[11,22,33,0]];
常数新=旧[1];

列表的缺点是,在末尾添加和删除项目相对昂贵。但在实践中,如果您使用递归以函数的方式构造代码,那么使用该列表将非常自然。非常有效。

我假设这是相同的结果,只是RationalML以这种方式表示链表。我假设这是相同的结果,只是RationalML以这种方式表示链表。感谢您的评论,如何正确打印到控制台?看起来您可能需要一个数组:
Js.log(array.map2((x,y)=>x+y、[1,2,3]、[10,20,30]更多信息感谢您的评论,如何正确打印到控制台?看起来您可能需要一个数组:
Js.log(array.map2((x,y)=>x+y,[| 1,2,3 |],[| 10,20,30 |])更多信息