我正在尝试在F#中进行一些列表理解。然后我找到了this

let evens n =
    { for x in 1 .. n when x % 2 = 0 -> x }
print_any (evens 10)

let squarePoints n =
    { for x in 1 .. n
      for y in 1 .. n  -> x,y }
print_any (squarePoints 3)

第一个仍然可以,但是第二个已经过时了。最新的(1.9.7.8)F#编译器不支持此样式。

经过一番搜索,我发现这可行
let vec1 = [1;2;3]
let vec2 = [4;5;6]
let products = [for x in vec1 do for y in vec2 do yield x*y]

有人可以指出为什么更改语法吗?谢谢。

最佳答案

  • 嵌套的for循环需要一个do
  • 您需要使用seq {..}。没有{..}seq格式不再起作用。
  • 不再支持when循环模式中的for保护。
  • print_any something已弃用。请改用printf "%A" something

  • 此代码应工作:
    let evens n =
        seq { for x in 1 .. n do if x%2=0 then yield x }
    printf "%A" (evens 10)
    
    let squarePoints n =
        seq { for x in 1 .. n do
                for y in 1 .. n  -> x,y }
    printf "%A" (squarePoints 3)
    

    如果您只想返回一个值,则仍然可以使用->:
    let vec1 = [1;2;3]
    let vec2 = [4;5;6]
    let products = [for x in vec1 do for y in vec2 -> x*y]
    

    顺便说一下,我发现观察F#随时间的演变很有趣。不幸的是,早期采用者的书架上的书有些过时了(我不介意)。

    10-06 09:54