F #: nemohu vrátit přístroj v klauzuli dělat, a přesto mají vedlejší účinky

hlasů
1

Píšu jednoduchý ini soubor parser a mám malý problém s inicializace objektu v klauzule „dělat“. To mě chce vrátit jednotku, ale nemohu dostat funkci blankity dělat vedlejší účinky, pokud se pokusím potrubí do „ignorovat“, nebo jestli jsem se vrátit „()“ přímo.

Tento kód funguje jako samostatná funkce, protože jsem se může ignorovat výsledky.

#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))
Položena 24/07/2009 v 18:35
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
6

Použití Seq.iter(provádění akce pro každý prvek - vrací unit) místo Seq.map(transformující prvků).

Kód nefunguje ignore, protože Seqto jsou vyhodnocovány líně, a když budete ignorovat výsledek, není třeba spustit libovolný kód vůbec. Přečtěte si tento článek

Odpovězeno 24/07/2009 v 18:44
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more