Trong một nỗ lực để hiểu khả năng lập trình chức năng, tôi đã tập hợp một số chức năng cơ bản mà bạn có thể soạn cùng nhau để xây dựng các biểu thức chính quy phức tạp. Bây giờ sau khi một số thử nghiệm tôi đã tìm thấy điều này hoạt động nhưng bạn có thể viết một số mã khủng khiếp trong bất kỳ ngôn ngữ sẽ làm việc. Đây có phải là loại mã bạn sẽ tìm thấy một lập trình viên F # chuyên nghiệp hay tôi đang lạm dụng tính năng này?Tôi có sử dụng đúng thành phần chức năng không?
Lưu ý:test
cụ thể là những gì tôi đang đề cập đến.
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()
Thật tuyệt khi biết rằng tôi đang tiến bộ trong các kỹ năng lập trình chức năng của mình. Bạn đã cho tôi thực sự vui mừng để thử và bọc với tất cả vào cú pháp biểu thức tính toán thanh lịch. :) Dù sao cảm ơn lời khuyên của bạn và giấy * (Tôi là một fan hâm mộ của bất cứ điều gì Erik Meijer.) *. – ChaosPandion
Giấy thú vị; Cảm ơn bạn đã đăng các liên kết. – TechNeilogy