Tôi đã dạy bản thân mình F # gần đây, và tôi đến từ một nền tảng bắt buộc (C++/C#). Như một bài tập, tôi đã làm việc trên các chức năng có thể làm những thứ với ma trận, như thêm, nhân, nhận định thức, vv Mọi thứ diễn ra tốt đẹp trong vấn đề này, nhưng tôi thấy rằng có lẽ tôi không đưa ra quyết định tốt nhất khi xử lý đầu vào không hợp lệ, ví dụ:F #: Một số, Không, hoặc Ngoại lệ?
// I want to multiply two matrices
let mult m1 m2 =
let sizeOK = validateDims m1 m2
// Here is where I am running to conceptual trouble:
// In a C# world, I would throw an exception.
if !sizeOK then
raise (InvalidOperationException("bad dimensions!")
else
doWork m1 m2
Vì vậy, trong khi kỹ thuật này hoạt động, điều này có phù hợp với ngôn ngữ chức năng không? Là nó trong tinh thần của lập trình chức năng? Hoặc nó sẽ làm cho ý nghĩa hơn để viết lại nó như:
let mult m1 m2 =
let sizeOK = validateDims m1 m2
if !sizeOK then
None
else
Some doWork m1 m2
Trong trường hợp này, tôi đang trở về một lựa chọn, trong đó bổ sung thêm thêm một lớp xung quanh ma trận, nhưng tôi cũng có thể sử dụng kết quả của hàm, ngay cả trong thất bại các trường hợp (Không) với kết hợp mẫu, v.v. tại một số điểm sau này trong chương trình. Vì vậy, có một thực hành tốt nhất cho các loại kịch bản? Lập trình chức năng sẽ làm gì?
Tôi tin rằng sau này là nhiều hơn trong "tinh thần" của FP. Bạn có thể muốn xem xét đơn nguyên Có lẽ cũng như đó là một cách tiếp cận phổ biến để xử lý các yếu tố đầu vào xấu. –
Như pad nói trong câu trả lời của mình tôi cũng thường thực hiện hai chức năng, một trong đó ném về lỗi và một chức năng thử giống hệt nhau trả về một Option/Choice thay vì ném. sau đó tôi sử dụng một trong đó làm cho mã cuối cùng của tôi trông đẹp nhất :) để xử lý Option/Choice dễ dàng hơn, bạn có thể muốn đọc "lập trình hướng tuyến đường sắt": http://fsharpforfunandprofit.com/posts/recipe-part2/ – stmax