Ф#:Я не могу вернуть единицу в предложении do, и у меня все равно возникают побочные эффекты

StackOverflow https://stackoverflow.com/questions/1179050

Вопрос

Я пишу простой анализатор ini-файлов, и у меня возникла небольшая проблема с инициализацией объекта в предложении «do».Он хочет, чтобы я вернул единицу измерения, но я не могу заставить функцию пустости выполнять побочные эффекты, если я попытаюсь передать «игнорировать» или верну «()» напрямую.

Этот код работает как отдельная функция, потому что я может игнорировать результаты.

#light

module Utilities.Config

open System
open System.IO
open System.Text.RegularExpressions
open System.Collections.Generic

type Config(?fileName : string) =
    let fileName = defaultArg fileName @"C:\path\myConfigs.ini"

    static let defaultSettings =
        dict[ "Setting1", "1";
              "Setting2", "2";
              "Debug",    "0";
              "State",    "Disarray";]

    let settingRegex = new Regex(@"\s*(?<key>([^;#=]*[^;#= ]))\s*=\s*(?<value>([^;#]*[^;# ]))")
    let fileSettings = new Dictionary<string, string>()
    let addFileSetting (groups : GroupCollection) =
        fileSettings.Add(groups.Item("key").Value, groups.Item("value").Value)

    do  File.ReadAllLines(fileName)
        |> Seq.map(fun line -> settingRegex.Match(line))
        |> Seq.filter(fun mtch -> mtch.Success)
        |> Seq.map(fun mtch -> addFileSetting(mtch.Groups) // Does not have the correct return type
        //|> ignore //#1 Does not init the dictionary
        //()        //#2 Does not init the dictionary

    //The extra step will work
    member c.ReadFile =
        File.ReadAllLines(fileName)
        |> Seq.map(fun line -> settingRegex.Match(line))
        |> Seq.filter(fun mtch -> mtch.Success)
        |> Seq.map(fun mtch -> addFileSetting(mtch.Groups))
Это было полезно?

Решение

Использовать Seq.iter (выполнение действия для каждого элемента – возврат unit) вместо Seq.map (трансформирующие элементы).

Код не работает с ignore потому что Seqвычисляются лениво, и когда вы игнорируете результат, вообще нет необходимости запускать какой-либо код. Прочтите эту статью

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top