Tại Sao Don Nguyen

Theo ý kiến ​​khiêm tốn của tôi, câu trả lời cho câu hỏi nổi tiếng “Thế nào là một đơn nguyên?” , đặc biệt là những người được bình chọn nhiều nhất, cố gắng giải thích thế nào là một đơn nguyên mà không giải thích rõ ràng tại sao các đơn vị thực sự cần thiết . Họ có thể được giải thích là giải pháp cho một vấn đề?

Những nghiên cứu bạn đã thực hiện? Bạn đã nhìn ở đâu? Những tài nguyên bạn đã tìm thấy? Chúng tôi hy vọng bạn thực hiện một lượng nghiên cứu đáng kể trước khi hỏi và cho chúng tôi biết câu hỏi bạn đã thực hiện nghiên cứu nào . Có nhiều tài nguyên cố gắng giải thích động lực cho tài nguyên – nếu bạn chưa tìm thấy chút nào, bạn có thể cần nghiên cứu thêm một chút. Nếu bạn đã tìm thấy một số nhưng họ không giúp bạn, nó sẽ làm cho câu hỏi này tốt hơn nếu bạn giải thích những gì bạn đã tìm thấy và tại sao cụ thể họ không làm việc cho bạn.
— DW
8
Điều này chắc chắn là phù hợp hơn cho Lập trình viên .StackExchange và không phù hợp với StackOverflow. Tôi sẽ bỏ phiếu để di chuyển nếu tôi có thể, nhưng tôi không thể. = (
— jpmc26
3
jpmc26 Rất có thể nó sẽ bị đóng ở đó là “chủ yếu dựa trên quan điểm”; ít nhất đây là một cơ hội (như được thể hiện bởi số lượng người ủng hộ khổng lồ, nhanh chóng mở cửa trở lại vào ngày hôm qua và không có thêm phiếu bầu nào nữa)
— Izkata

Câu trả lời:

580

Tại sao chúng ta cần các đơn nguyên?

Chúng tôi muốn lập trình chỉ sử dụng các chức năng . (“Lập trình chức năng (FP)” sau khi tất cả).

Bạn đang xem: Tại sao don nguyen

Sau đó, chúng tôi có một vấn đề lớn đầu tiên. Đây là một chương trình:

f(x) = 2 * x

g(x,y) = x / y

Làm thế nào chúng ta có thể nói những gì sẽ được thực hiện đầu tiên ? Làm thế nào chúng ta có thể hình thành một chuỗi các hàm theo thứ tự (tức là một chương trình ) bằng cách sử dụng không nhiều hơn các hàm ?

Giải pháp: soạn các hàm . Nếu bạn muốn đầu tiên gvà sau đó f, chỉ cần viết f(g(x,y)). Theo cách này, “chương trình” cũng là một chức năng : main = f(g(x,y)). Được rồi nhưng …

Nhiều vấn đề hơn: một số chức năng có thể không thành công (nghĩa là g(2,0)chia cho 0). Chúng tôi không có “ngoại lệ” trong FP (ngoại lệ không phải là chức năng). Làm thế nào để chúng ta giải quyết nó?

Giải pháp: Chúng ta hãy cho phép các hàm trả về hai loại : thay vì có g : Real,Real -> Real(hàm từ hai thực thành thực), hãy cho phép g : Real,Real -> Real | Nothing(hàm từ hai thực thành (thực hoặc không có gì)).

Nhưng các hàm nên (đơn giản hơn) chỉ trả về một thứ .

Giải pháp: chúng ta hãy tạo ra một loại dữ liệu mới được trả về, một ” kiểu đấm bốc ” có thể là thật hoặc đơn giản là không có gì. Do đó, chúng ta có thể có g : Real,Real -> Maybe Real. Được rồi nhưng …

Điều gì xảy ra bây giờ f(g(x,y))? fchưa sẵn sàng để tiêu thụ a Maybe Real. Và, chúng tôi không muốn thay đổi mọi chức năng mà chúng tôi có thể kết nối gđể tiêu thụ a Maybe Real.

Giải pháp: chúng ta hãy có một chức năng đặc biệt để “kết nối” / “soạn thảo” / “liên kết” các chức năng . Bằng cách đó, chúng ta có thể, đằng sau hậu trường, điều chỉnh đầu ra của một chức năng để cung cấp chức năng sau.

Trong trường hợp của chúng tôi: g >>= f(kết nối / soạn gthành f). Chúng tôi muốn >>=nhận gđầu ra, kiểm tra nó và, trong trường hợp đó Nothingchỉ là không gọi fvà trả lại Nothing; hoặc ngược lại, giải nén hộp Realvà cho fnó ăn . (Thuật toán này chỉ là việc thực hiện >>=cho Maybeloại). Cũng lưu ý rằng chỉ >>=được viết một lần cho mỗi “loại quyền anh” (hộp khác nhau, thuật toán thích ứng khác nhau).

Nhiều vấn đề khác phát sinh có thể được giải quyết bằng cách sử dụng cùng một mẫu này: 1. Sử dụng “hộp” để mã hóa / lưu trữ các ý nghĩa / giá trị khác nhau và có các hàm như gtrả về các “giá trị được đóng hộp” đó. 2. Có một nhà soạn nhạc / trình liên kết g >>= fđể giúp kết nối gđầu ra fcủa đầu vào với đầu vào, vì vậy chúng tôi không phải thay đổi gì fcả.

Các vấn đề đáng chú ý có thể được giải quyết bằng kỹ thuật này là:

có trạng thái toàn cầu mà mọi chức năng trong chuỗi chức năng (“chương trình”) có thể chia sẻ: giải pháp StateMonad.

Xem thêm: Tại Sao Lại Mọc Mụn Và Cách Điều Trị Hiệu Quả Nhất, 11 Nguyên Nhân Khiến Da Bạn Nổi Mụn

Chúng tôi không thích “hàm không tinh khiết”: các hàm mang lại đầu ra khác nhau cho cùng một đầu vào. Do đó, hãy đánh dấu các hàm đó, làm cho chúng trả về giá trị được gắn thẻ / đóng hộp: IOđơn nguyên.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *