将函数应用于每个元素以生成以 F 为单位的产量序列#

Apply function to each element to generate sequence with yield in F#

提问人:blfuentes 提问时间:12/14/2019 更新时间:12/14/2019 访问量:302

问:

我对 F# 比较陌生,对我来说更复杂的事情之一是如何正确使用产量。 我正在尝试通过读取文本文件并为每行提取带有 a 的值并将它们添加到序列(结果)中来生成序列

来自 http://www.fssnip.net/29/title/Regular-expression-active-pattern 的正则表达式函数

let (|Regex|_|) pattern input =
    let m = Regex.Match(input, pattern)
    if m.Success then Some(List.tail [ for g in m.Groups -> g.Value ])
    else None

let extractCoordinates input =
    match input with
    | Regex @"\(([0-9]{3})\)[-. ]?([0-9]{3})[-. ]?([0-9]{4})" [ area; prefix; suffix ] ->
        [ area; prefix; suffix ]
    | _ -> []

读取文件并生成序列

open System.IO

let filepath = __SOURCE_DIRECTORY__ + @"../../test_input_01.txt"

let values =
        File.ReadAllLines 
        |> Seq.map (fun l -> extractCoordinates l)

但这是行不通的

错误 FS0001:类型“string -> string []”与类型“seq<a>”不兼容

谁能告诉我如何将函数应用于列表的每个元素并将输出存储到序列结果中?使用与否...yield

F# 序列 产量

评论


答:

1赞 nilekirk 12/14/2019 #1

你的方法是正确的。您得到的错误是由于没有提供参数:Seq.mapFile.ReadAllLines

let values =
    File.ReadAllLines filepath
    |> Seq.map (fun l -> extractCoordinates l)