3

我正在尝试在 F# 中编写列表理解,但无法编译:

[for x in xs do
    let y = f(x)
    when g(y) -> y]

有没有办法在列表理解的中间保存中间计算?我怎样才能修改这个列表理解以便它编译?

4

2 回答 2

9

我会跳过列表理解。

let ys = xs |> List.map f |> List.filter g

但是,让您的代码正常工作很简单。

let ys = [ for x in xs do
               let y = f(x)
               if g(y) then yield y ] 
于 2012-11-25T01:45:31.193 回答
5

要扩展@ChaosPandion 的解决方案,您还可以使用List.choose- 将其视为 和 的组合,List.map从而List.filter避免创建额外的列表(即,而不是创建一个List.map仅将其传递给的列表List.filter)。

let ys =
    xs
    |> List.choose (fun x ->
        let y = f x
        if g y then Some y else None)
于 2012-11-25T13:55:26.830 回答