List OCaml和ReasonML中的不同结果
有一种情况是将两个向量映射为一个向量。我希望两个ML的结果应该是相同的。不幸的是,ReasonML的结果是不同的。请帮助并评论如何修复它 OCamlList 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
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 |])代码>更多信息