कार्यात्मक प्रोग्रामिंग की क्षमताओं को समझने के प्रयास में मैंने कुछ बुनियादी कार्यों को एक साथ रखा है जिन्हें आप जटिल नियमित अभिव्यक्तियों के निर्माण के लिए एक साथ लिख सकते हैं। अब कुछ परीक्षणों के बाद मुझे यह काम मिल गया है लेकिन आप काम करेंगे जो किसी भी भाषा में कुछ भयानक कोड लिख सकते हैं। क्या यह कोड आपको एक पेशेवर एफ # प्रोग्रामर लेखन मिलेगा या क्या मैं इस सुविधा का दुरुपयोग कर रहा हूं?क्या मैं फ़ंक्शन संरचना का सही उपयोग कर रहा हूं?
नोट:test
विशेष रूप से क्या मैं की बात कर रहा हूँ।
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()
यह जानना अच्छा है कि मैं अपने कार्यात्मक प्रोग्रामिंग कौशल में प्रगति कर रहा हूं। आपने मुझे सुरुचिपूर्ण कम्प्यूटेशनल अभिव्यक्ति वाक्यविन्यास में सभी के साथ प्रयास करने और लपेटने के लिए वास्तव में उत्साहित किया है। :) वैसे भी आपकी सलाह और पेपर * के लिए धन्यवाद * (मैं एरिक मीजर का कुछ प्रशंसक हूं।) *। – ChaosPandion
दिलचस्प पेपर; लिंक पोस्ट करने के लिए धन्यवाद। – TechNeilogy