Разбор разделенных разделителем значений в F # - PullRequest
0 голосов
/ 20 сентября 2011

Я анализирую строковые записи в этой форме:

description: double/double/double

, например:

item description: 0.4/8/-24.66

Каждая запись должна приводить к объекту:

new MyObj("first item", 0.4, 2.4, -24.66)

Я мог бы легко сделать это с помощью регулярного выражения и процедурного подхода, но полученный код подвержен ошибкам и довольно уродлив (по крайней мере, с функциональной точки зрения).

Как это можно сделать вболее элегантный способ?

Ответы [ 2 ]

4 голосов
/ 20 сентября 2011

Хорошо, FParsec хорош:

#r "FParsecCS.dll"
#r "FParsec.dll"

open FParsec

let parser : Parser<_,unit> =
    sepBy pfloat (pchar '/')

А потом run parser "0.4/8/-24.66" возвращает val it : ParserResult<float list,unit> = Success: [0.4; 8.0; -24.66].

2 голосов
/ 20 сентября 2011

Или вы можете просто создать простую функцию синтаксического анализатора string->MyObj, например:

type MyObj(descr:string, a:float, b:float, c:float) =
    override this.ToString() =
        System.String.Format("{0}: {1}; {2}; {3}", descr,a,b,c)

let myobjfromstr (str:string) = 
    let flds = str.Split([|':';'/'|])
    let ip s = System.Double.Parse(s)    
    new MyObj(flds.[0], ip flds.[1], ip flds.[2], ip flds.[3])

myobjfromstr "item description: 0.4/8/-24.66" |> printfn "%A"

( update: Я догадался, что записи разделены новой строкой или чем-то вродеэто и было разделено на список. Во-вторых, в твоем вопросе нет ничего подобного ...)

...