如何(是否可能)在 F# 的闭包内调用 yield?

How to (is it possible to) call yield inside of closure in F#?

我正在尝试编写一个函数,它采用字符串序列和 returns 字符串序列,所有字符串序列都在 Seq.iter 的帮助下以给定的另一个字符串为前缀,但无法推断正确语法。

//let concatElemSeq (elem : string) (s : seq<string>) : seq<string> = (Seq.map (fun it -> elem+it) s)

let concatElemSeq (elem : string) (s : seq<string>) : seq<string> = seq {
    Seq.iter (fun it -> 
        yield elem+it
        ()
    ) s
}

如何完成?

不,不可能这样嵌套 yieldyield 必须是计算表达式语法的一部分。

要达到你想要的效果,请使用 for:

let concatElemSeq (elem : string) (s : seq<string>) : seq<string> = seq { 
    for it in s do
        yield elem+it
}

或者更短,使用 -> 作为 do yield 的快捷方式:

let concatElemSeq (elem : string) (s : seq<string>) : seq<string> = seq { 
    for it in s -> elem+it
}

或者,您可以使用 Seq.map 并部分应用 (+):

let concatElemSeq elem s = Seq.map ((+) elem) s

然后eta-reduce:

let concatElemSeq elem = Seq.map ((+) elem)