Có cách nào nhanh chóng để sử dụng làm chức năng cụ thể (loại, giả sử, (A) => B
) làm PartialFunction[A, B]
? Cú pháp ngắn gọn nhất mà tôi biết là:Scala PartialFunctions từ bê tông
(a: A) => a match { case obj => func(obj) }
Có một chuyển đổi ngầm bất cứ nơi nào, một cái gì đó như:
implicit def funcAsPartial[A, B](func: A => B) = new PartialFunction[A, B] {
def isDefinedAt(a: A) = true
def apply(a: A) = func(a)
}
Tôi đoán tôi chỉ viết những gì tôi đang tìm kiếm, nhưng điều này đã tồn tại trong thư viện Scala?
Cảm ơn bạn; Tôi đã có quan niệm sai rằng Function1 ngụ ý được xác định trên toàn bộ miền. –
@AaronNovstrup: giải thích của bạn về hợp đồng của PartialFunction là hợp đồng duy nhất có ý nghĩa, nhưng không được phản ánh bởi ScalaDocs (ít nhất là cho đến 2.9.1). ScalaDocs của 'PartialFunction' cho rằng:" Một phần chức năng của kiểu 'PartialFunction [A, B]' là một hàm đơn nhất trong đó miền không nhất thiết phải bao gồm tất cả các giá trị của kiểu 'A'." Hơn nữa, họ không bao giờ cho rằng nó an toàn (theo nghĩa nào) để gọi f ở bất cứ nơi nào được định nghĩa, và điều đó khá dễ vi phạm, như được thực hiện bởi '' PartialFunction' literal '{case 0 => 1/0}'. Bạn lấy thông tin đó ở đâu? Báo cáo lỗi có cần phải được nộp không? – Blaisorblade
@Blaisorblade Tôi tin rằng tôi đã đọc giải thích này trên danh sách gửi thư khi tôi đang học Scala (đã lâu rồi), và tôi không xem bất kỳ tài liệu nào khi tôi viết câu trả lời này. Và, vâng, thật dễ dàng và thậm chí hơi phổ biến để vi phạm hợp đồng này (ví dụ: để quấn/trả lại một ngoại lệ trong khối bắt). Điểm thực là PartialFunctions xác định miền của chúng trong khi các hàm bình thường không (với một số mờ về những gì thực sự có ý nghĩa). –