我可以将let语句放在F#list comprehension中吗?

时间:2012-11-25 01:36:09

标签: f#

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

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

有没有办法在列表理解中保存中间计算?我怎样才能重新编写这个列表理解,以便编译?

2 个答案:

答案 0 :(得分: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 ] 

答案 1 :(得分:5)

要扩展@ ChaosPandion的解决方案,您还可以使用List.choose来编写此内容 - 将其视为List.mapList.filter的组合,以避免创建额外的列表(即,而不是创建一个包含List.map的列表,只是将其传递给List.filter)。

let ys =
    xs
    |> List.choose (fun x ->
        let y = f x
        if g y then Some y else None)