Tôi đang học ngôn ngữ lập trình Haskell. Từ những gì tôi đang đọc, Input / Ouput ( IO ) đặt ra những thách thức cho độ tinh khiết của Haskell, vì theo định nghĩa, chúng ta đang tương tác với thế giới bên ngoài. Từ Wikipedia:
Trong một ngôn ngữ chức năng thuần túy, chẳng hạn như Haskell, các chức năng không thể có bất kỳ tác dụng phụ có thể nhìn thấy bên ngoài như là một phần của ngữ nghĩa chức năng. Mặc dù một chức năng không thể trực tiếp gây ra hiệu ứng phụ, nhưng nó có thể xây dựng một giá trị mô tả hiệu ứng phụ mong muốn, mà người gọi nên áp dụng vào thời điểm thuận tiện.
Trong ký hiệu Haskell, giá trị của loại IO a đại diện cho một hành động mà khi được thực hiện sẽ tạo ra giá trị của loại a.
Chẳng mấy chốc, tôi biết rằng IO là một ví dụ về một đơn vị Haskell. Mặc dù chúng tôi không nhận được nhiều lời giải thích về các đơn vị là gì. Từ Functor, Ứng dụng và Monads trong hình ảnh
Cách tìm hiểu về Monads:
- Nhận bằng tiến sĩ khoa học máy tính.
- Vứt nó đi vì bạn không cần nó cho phần này!
Đến bây giờ, tôi đã đọc các định nghĩa khác nhau về - rằng họ thêm ngữ cảnh hoặc tạo các ngôn ngữ lập trình nhỏ hơn bên trong một ngôn ngữ lớn xung quanh một khái niệm cụ thể. Vẫn đang cố gắng để có được ý nghĩa về những gì các đơn nguyên và cách những ý tưởng đó áp dụng.
Trong Haskell, monad
là một kiểu chữ khác, về cơ bản chỉ có một quy tắc xác định nó. Và IO
là một ví dụ về điều đó.
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
/programming/44965/what-is-a-monad
Có điều gì đó đại số đang diễn ra ở đây? Đại số về IO là gì?
Tôi xin lỗi vì ngôn ngữ cụ thể. Tôi hy vọng rằng hầu hết các cuộc thảo luận này áp dụng cho tất cả các ngôn ngữ lập trình chức năng. Bất kỳ lỗi nào trong cuộc thảo luận của tôi thể hiện sự hiểu biết hạn chế của riêng tôi về lĩnh vực này.
Có một định nghĩa khác về monad tôi tìm thấy trong nLab thậm chí không cụ thể đối với các ngôn ngữ lập trình.
Trong một câu hỏi riêng biệt, tôi muốn hiểu làm thế nào khái niệm lý thuyết thể loại của đơn nguyên khớp với định nghĩa CS trong trường hợp của Haskell.