5

Trong ít nhất một số ngôn ngữ gia đình ML, bạn có thể xác định các bản ghi mà bạn có thể thực hiện đối sánh mẫu, ví dụ: http://learnyouahaskell.com/making-our-own-types-and-typeclasses - ý tưởng cơ bản là bạn định nghĩa một loại bản ghi với các trường được đặt tên, một hàm tạo được tạo tự động với các trường đó làm tham số để bạn có thể tạo bản ghi loại đó và trình trích xuất được tạo tự động với các trường đó làm tham số để bạn có thể tạo mẫu khớp với các bản ghi loại đó.Ngôn ngữ chỉ sử dụng Scala với các bộ giải nén quá tải?

Scala tiến thêm một bước và cho phép các trường được lưu trữ trong bản ghi, tham số hàm tạo và tham số trình trích xuất được tách riêng với nhau, ví dụ: http://daily-scala.blogspot.com/2009/11/overloaded-unapply.html - trong đó nó đang sống với mục tiêu hỗ trợ cả lập trình hướng đối tượng và chức năng. (Các ngôn ngữ hướng đối tượng của khóa học thường cho phép các trường được lưu trữ và các tham số của hàm dựng được tách riêng, mặc dù chúng không có các trình khai thác.)

Có ngôn ngữ nào khớp và cho phép tách không?

Có bất kỳ điều gì được viết về ưu và nhược điểm của việc tách rời đó không?

+0

Haskell là ngôn ngữ gia đình ML? – millimoose

+4

Không bao giờ sử dụng chúng, nhưng quan điểm của Haskell tương tự – Owen

+0

Và tất nhiên, các ngôn ngữ động như Scheme cho phép điều này mà không cần hỗ trợ ngôn ngữ, nhưng tôi không biết liệu có ai sử dụng nó không – Owen

Trả lời

9

Tôi thừa nhận rằng tôi không có 100% nền cần hiểu câu hỏi của bạn, nhưng tôi có thể nói rằng F # có một tính năng được gọi là "Active Patterns" có vẻ như nó có thể được sử dụng để xây dựng chức năng giống như daily-scala của bạn liên kết thể hiện.

Đó có phải là vùng lân cận của những gì bạn đang tìm kiếm không?

5

Không, F # cũng cung cấp tính năng đó.

Các ví dụ trong bài viết thứ hai có thể được thực hiện bằng Partial Active Patterns:

let (|String|_|) = function "s" -> Some "yay" | _ -> None 
let (|Int|_|) = function 1 -> Some "hmm" | _ -> None 

let (|StringList|_|) = function "x" -> Some [1; 2; 3] | _ -> None 
let (|IntList|_|) = function 1 -> Some ["one"; "two"] | _ -> None 

match 1 with 
| Int s -> printfn "%O" s 
| _ -> printfn "Unmatched" 

match "s" with 
| String s -> printfn "%O" s 
| _ -> printfn "Unmatched" 

match "x" with 
| StringList [x; y; z] -> printfn "%O" (x, y, z) 
| _ -> printfn "Unmatched" 

match 1 with 
| IntList [x; y] -> printfn "%O" (x, y) 
| _ -> printfn "Unmatched" 

Patterns tích cực là một kỹ thuật mạnh mẽ, thậm chí bạn có thể viết nó một cách recursive. Sự kết hợp của nó với kết hợp mẫu cung cấp một bộ công cụ tiện lợi cho việc hủy dữ liệu. Tuy nhiên, khớp mẫu là vô tận, do đó bạn phải sử dụng ký tự đại diện (_) làm mẫu cuối cùng.

4

Có một lịch sử lâu dài của mô hình lớp học đầu tiên bằng các ngôn ngữ chức năng gõ.

Trong vùng đất Haskell, chúng tôi sử dụng phần mở rộng -XViewPatterns cho các mẫu có lập trình.

Mẫu xem thực sự đầu tiên quay lại giấy 1987 của Phil Wadler trên views

Các vấn đề liên quan