2009-07-24 39 views
1

我在写一个简单的ini文件解析器,并且在“do”子句中初始化对象时遇到了一些问题。它希望我返回一个单元,但是如果我尝试插入“忽略”或直接返回“()”,我无法获得空白功能来执行副作用。F#:我不能在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)) 

回答

6

使用Seq.iter(执行用于每个元件的行为 - 返回unit)代替Seq.map(转化元件)。

该代码不适用于ignore,因为Seq的评估是懒惰的,当您忽略结果时,根本不需要运行任何代码。 Read this article

+0

+1帮助我获得纪律勋章。 :) – dahlbyk 2009-07-24 22:21:43

相关问题