F#:我不能在do子句中返回单位但仍然有副作用

tel*_*re4 1 f# initialization object unit-type

我正在编写一个简单的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))
Run Code Online (Sandbox Code Playgroud)

Dar*_*rio 6

使用Seq.iter(为每个元素执行一个动作 - 返回unit)而不是Seq.map(转换元素).

代码不起作用,ignore因为Seq懒惰地评估它们,当你忽略结果时,根本不需要运行任何代码.阅读这篇文章