En un esfuerzo por comprender las capacidades de la programación funcional, reuní algunas funciones básicas que puede componer juntas para crear expresiones regulares complejas. Ahora, después de algunas pruebas, he encontrado que esto funciona, pero puedes escribir un código horrible en cualquier idioma que funcione. ¿Es este el tipo de código que encontraría un programador profesional de F # escribiendo o estoy abusando de la función?¿Estoy utilizando correctamente la composición de funciones?
Nota:test
es específicamente a lo que me refiero.
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()
Es bueno saber que estoy haciendo progresos en mis habilidades de programación funcional. Me entusiasma mucho tratar de abarcar todo en la elegante sintaxis de la expresión computacional. :) De todos modos, gracias por tu consejo y el papel * (soy un fan de cualquier cosa Erik Meijer.) *. – ChaosPandion
Interesante documento; Gracias por publicar el enlace. – TechNeilogy