Думаю, я нашел способ заставить его работать: он компилируется, когда я добавляю ключевое слово inline
в свою parseOptionalValue
функцию!
Я, честно говоря, не очень хорошо понимаю причину, по которой это не было ' t, в первую очередь, и точная роль ключевого слова inline
...
У меня все еще есть слабая надежда, что есть лучший способ написать строго типизированную версию моего первоначального примера, так что почувствуйте бесплатно предлагать другие ответы ...
Вот очищенная и рабочая версия:
open FSharp.Text.RegexProvider
type DotnetVersionRegex = Regex< @"dotnet (?<Version>.*)" >
type OutlookVersionRegex = Regex< @"Outlook (?<Version>.*)" >
let inline parseOptionalValue matcher values =
values
|> Seq.map (fun x -> matcher x)
|> Seq.tryFind (fun x ->
(^T : (member Success: bool) x) && (^T : (member Version: System.Text.RegularExpressions.Group) x).Success) // x.Success && x.Version.Success
|> function
| Some m -> Some ((^T : (member Version: System.Text.RegularExpressions.Group) m).Value) // m.Version.Value
| None -> None
let dotnetVersion (values: string array) = parseOptionalValue (DotnetVersionRegex().TypedMatch) values
let outlookVersion (values: string array) = parseOptionalValue (OutlookVersionRegex().TypedMatch) values
let printSome = function
| Some x -> printfn "%O" x
| None -> printfn "None"
let values = "dotnet 4.5;Outlook 16".Split(';')
dotnetVersion values |> printSome
outlookVersion values |> printSome