首页 > 解决方案 > 将函数应用于每个元素以在 F# 中生成具有产量的序列

问题描述

我对 F# 比较陌生,对我来说更复杂的事情之一是如何正确使用 yield。我正在尝试通过读取文本文件并使用 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#sequenceyield

解决方案


你的方法Seq.map是正确的。您得到的错误是没有提供参数File.ReadAllLines

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

推荐阅读