我正在尝试在F#中编写列表理解,但无法编译:
[for x in xs do
let y = f(x)
when g(y) -> y]
有没有办法在列表理解中保存中间计算?我怎样才能重新编写这个列表理解,以便编译?
答案 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.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)