f# - F#中for循环中的'->'和'do'有什么区别
问题描述
我可以做这个:
[ for i in 0 .. 5 -> i ]
或者
[ for i in 0 .. 5 do i ]
但是,虽然我可以这样做:
[ for i in 0 .. 5 do yield! [i * 4; i] ]
我不能这样做:
[ for i in 0 .. 5 -> yield! [i * 4; i] ]
这是为什么?两者如何区别对待?
解决方案
这是相当棘手的,因为这里有一些 F# 隐式执行的操作。
首先,->
语法实际上只是 的快捷方式do yield
,因此以下翻译为:
[ for i in 0 .. 5 -> i ]
= [ for i in 0 .. 5 do yield i ]
这解释了为什么你不能这样做-> yield!
,因为翻译会导致:
[ for i in 0 .. 5 -> yield! [i * 4; i] ]
= [ for i in 0 .. 5 do yield (yield! [i * 4; i]) ]
你会yield!
嵌套在里面yield
,这是没有意义的。
第二个棘手的问题是 just 的语法do
。这是 F# 中最近的一个变化,它使编写列表生成器变得更容易(这对于构造诸如 HTML 树之类的特定领域的语言来说非常棒)——编译器隐式插入yield
,因此代码翻译为:
[ for i in 0 .. 5 do i ]
= [ for i in 0 .. 5 do yield i ]
有趣的是,这也适用于多个产量:
[ for i in 0 .. 5 do
i
i*10 ]
= [ for i in 0 .. 5 do
yield i
yield i*10 ]
->
这是和之间的另一个区别do
。使用->
,您只能产生一件事。使用do
,你可以产生多个东西。
我想现在使用的理由很少->
。这是在隐式之前的语言中yield
,因此它在早期版本的 F# 中很有用。do
当事情变得如此简单时,您可能不再需要它了。
推荐阅读
- glassfish - 我尝试将 glassfish 服务器与我的 Eclipse 集成,但出现错误“找不到基本名称的捆绑包”
- c# - 用组合框替换下拉列表(可编辑的下拉列表)
- data-visualization - 期望“结束”在字符 0 处匹配“如果”?
- java - java jar在nodeJs中执行时不显示是否正在运行?
- java - 启动层初始化时出错 java.lang.module.FindException: Module javafx.controls not found 在 vscode 中使用 JavaFX 时
- c++ - PS4 控制的遥控车的数字常量之前的预期标识符
- ruby-on-rails - 在 Ruby on Rails 中反转 JSON 对象顺序
- python-3.x - Python XML SOAP 请求返回 400 但 Postman 返回 200
- algorithm - 牛寻找长栅栏缝隙的算法
- javascript - 在反应中使用排序java脚本功能