如何(是否可能)在 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
}
如何完成?
不,不可能这样嵌套 yield
。 yield
必须是计算表达式语法的一部分。
要达到你想要的效果,请使用 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)
我正在尝试编写一个函数,它采用字符串序列和 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
}
如何完成?
不,不可能这样嵌套 yield
。 yield
必须是计算表达式语法的一部分。
要达到你想要的效果,请使用 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)