Работа со строками в F # иногда немного неудобна. Я бы, наверное, использовал тот же код, что и Дарио. Грамматика F # не позволяет использовать конструкторы в качестве функций первого класса, поэтому вы, к сожалению, не можете выполнить всю обработку в одном конвейере. В общем случае вы можете использовать статические члены и методы экземпляра в качестве функций первого класса, но не свойства или конструкторы экземпляра.
В любом случае, есть очень неприятный прием, который вы можете использовать, чтобы превратить конструктор в значение функции. Я бы не советовал на самом деле использовать его, но я был очень удивлен, увидев, что он действительно работает, поэтому я подумал, что стоит поделиться им:
let inline ctor< ^R, ^T
when ^R : (static member ``.ctor`` : ^T -> ^R)> (arg:^T) =
(^R : (static member ``.ctor`` : ^T -> ^R) arg)
Это определяет функцию, которая будет встроена во время компиляции, которая требует, чтобы параметр первого типа имел конструктор, который принимает значение параметра второго типа. Это указывается как ограничение времени компиляции (потому что .NET generics не может это выразить). Кроме того, F # не позволяет вам указать это, используя обычный синтаксис для указания ограничений конструктора (который должен принимать unit
в качестве аргумента), но вы можете использовать скомпилированное имя конструкторов. Теперь вы можете написать, например:
// just like 'new System.Random(10)'
let rnd = ctor<System.Random, _> 10
rnd.Next(10)
И вы также можете использовать результат ctor
как первоклассную функцию:
let chars = [ 'a'; 'b'; 'c' ]
let str = chars |> Array.ofSeq |> ctor<System.String, _>
Как я уже сказал, я думаю, что это в основном любопытство, но довольно интересное :-).