gpt4 book ai didi

f# - 在 F# 中的 for 循环中 '->' 和 'do' 之间有什么区别

转载 作者:行者123 更新时间:2023-12-03 15:42:30 24 4
gpt4 key购买 nike

我可以做这个:

[ 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 ,这没有任何意义。

第二个棘手的事情是只有 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 时,您可能不再需要它了让事情变得简单。

关于f# - 在 F# 中的 for 循环中 '->' 和 'do' 之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61490602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com