Là thành phần chức năng Haskell là một ví dụ của mẫu kiến ​​trúc ống & bộ lọc


9

Mẫu kiến ​​trúc ống & bộ lọc được định nghĩa là một chuỗi các phần tử xử lý, được sắp xếp sao cho đầu ra của mỗi phần tử là đầu vào của phần tử tiếp theo . Mọi ví dụ dường như xem xét kết nối giữa quá trình hoặc liên luồng được thực hiện thông qua một số loại bộ đệm chia sẻ.

Đối với tôi, có vẻ như thành phần chức năng Haskell đang thực hiện cùng một nhiệm vụ. Chúng ta có thể nói rằng đó là một thể hiện của mẫu này ngay cả khi nó chỉ là về thứ tự hàm và không có bộ đệm rõ ràng nào được sử dụng làm đường ống? Nếu có, chúng ta có thể nói điều tương tự cho ngôn ngữ không lười biếng không?

Câu trả lời:


8

Chúng được kết nối, nhưng kết nối là cách khác (loại).

Thành phần hình thái trong một danh mục phù hợp mô hình chính xác cả thành phần chức năng (trong đó danh mục Setdành cho ngôn ngữ nghiêm ngặt và CPOngôn ngữ lười biếng) và thành phần quy trình (trong đó danh mục là danh mục (AFAIK, không tên) trong đó các đối tượng là chuỗi, hình thái là vỏ các quá trình, và thành phần là toán tử đường ống). Các quy trình Shell có thể được nhìn thấy, mà không làm mất tính tổng quát hoặc độ chính xác, vì các hàm (lười biếng) của loại String -> WriterT String IO Stringvà các hàm thuần túy String -> Stringcó thể được chuyển đổi một cách dễ dàng sang và từ các chức năng của loại String -> Identity String, vì vậy cả hai thực sự chỉ là (>>=)ngụy trang.


1
Một CPOthể loại là gì? Google-fu của tôi rất yếu :(
Andres F.

3
@AresresF. Các thể loại của các Cnghệ nhân Pđầy Ođủ.
Ngọn lửa của Ptharien

2

Có một sự khác biệt. Các đường ống và bộ lọc xử lý các kết nối dữ liệu và dữ liệu, trong khi Thành phần chức năng Haskell xử lý các chức năng hạng nhất . Các chức năng hạng nhất có thể kết hợp theo cách mà các đường ống và bộ lọc không có.

Đọc thêm
Khả năng kết hợp có nghĩa là gì trong bối cảnh lập trình chức năng?


1
Thành phần không nhất thiết phải xử lý chức năng hạng nhất vì bản thân thành phần là chức năng hạng nhất. Ví dụ, thành phần của hàm ++, trong đó thành phần là ., ++ . ++sẽ lấy một giá trị và trả về giá trị đó tăng hai lần, nhưng ++không phải là hàm hạng nhất, nó chỉ lấy một giá trị và trả về một giá trị. Hàm thành phần là hàm lớp đầu tiên có hai hàm và trả về một.
Jimmy Hoffa

1
@JimmyHoffa, tôi nghĩ bạn đang nhầm lẫn giữa khái niệm 'chức năng hạng nhất' với 'chức năng bậc cao'. Khi một ngôn ngữ có 'chức năng hạng nhất', nó xử lý các chức năng giống như ngôn ngữ đó xử lý các loại dữ liệu hạng nhất khác; chúng có thể được truyền đến và trả về từ các hàm, được lưu trữ trong các cấu trúc dữ liệu, v.v ... Hàm bậc cao hơn tận dụng tính chất hạng nhất của hàm bằng cách lấy tham số hàm và / hoặc trả về giá trị hàm.
Levi Pearson

@LeviPearson yeah, tôi đã vô tình đặt não của tôi sang một bên khi tôi thức dậy vào buổi sáng tôi đã viết bình luận đó. Nếu bạn sẽ tiếp tục chọc vào đây để viết nội dung hay cho P.SE, hãy suy nghĩ về việc trò chuyện chung
Jimmy Hoffa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.