Nel tentativo di comprendere le funzionalità della programmazione funzionale, ho raggruppato alcune funzioni di base che è possibile comporre insieme per creare espressioni regolari complesse. Ora dopo alcuni test ho trovato che funziona, ma puoi scrivere un codice orribile in qualsiasi lingua che funzioni. È questo il tipo di codice in cui potresti trovare un programmatore F # professionale o sto abusando della funzione?Sto usando correttamente la composizione delle funzioni?
Nota:test
è specificamente ciò a cui mi riferisco.
type State = { input:string; index:int; succeeded:bool }
type Matcher = State -> State
let term (cs:char Set) =
fun s ->
if s.succeeded && s.index < s.input.Length && cs.Contains s.input.[s.index] then
{ input = s.input; index = s.index + 1; succeeded = true }
else
{ input = s.input; index = s.index; succeeded = false }
let quantify (term, min, max) =
let rec inner (s:State, count) =
if s.succeeded && s.index < s.input.Length && count <= max then
inner (term { input = s.input; index = s.index + 1; succeeded = true }, count + 1)
elif count >= min && count <= max then
{ input = s.input; index = s.index - 1; succeeded = true }
else
s
fun s -> inner (s, 0)
let disjunction leftTerm rightTerm =
fun s ->
let left = leftTerm s
if not left.succeeded then
let right = rightTerm s
if not right.succeeded then
{ input = s.input; index = s.index; succeeded = false }
else
right
else
left
let matcher input terms =
let r = terms { input = input; index = 0; succeeded = true }
if r.succeeded then r.input.Substring (0, r.index) else null
let test = // (abc|xyz)a{2,3}bc
disjunction // (abc|xyz)
(term (set "a") >> term (set "b") >> term (set "c"))
(term (set "x") >> term (set "y") >> term (set "z"))
>> quantify (term (set "a"), 2, 3) // (a{2,3})
>> term (set "b") // b
>> term (set "c") // c
let main() : unit =
printfn "%s" (matcher "xyzaabc" test)
System.Console.ReadKey true |> ignore
main()
È bello sapere che sto facendo progressi nelle mie capacità di programmazione funzionale. Mi hai davvero entusiasmato di provare a racchiudere tutto nell'elegante sintassi delle espressioni computazionali. :) Comunque grazie per il tuo consiglio e il documento * (Sono un fan di tutto ciò che Erik Meijer.) *. – ChaosPandion
Carta interessante; grazie per aver pubblicato il link – TechNeilogy