Ф#:Я не могу вернуть единицу в предложении do, и у меня все равно возникают побочные эффекты
-
19-09-2019 - |
Вопрос
Я пишу простой анализатор 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
вычисляются лениво, и когда вы игнорируете результат, вообще нет необходимости запускать какой-либо код. Прочтите эту статью
Не связан с StackOverflow