Đúng. Đây được gọi là "phong cách từ điển". Thỉnh thoảng khi tôi đang làm một số việc đặc biệt khó khăn, tôi cần loại bỏ một kiểu chữ và biến nó thành một từ điển, bởi vì từ điển truyền qua mạnh hơn 1 , nhưng thường khá cồng kềnh, làm cho mã đơn giản về mặt khái niệm trông khá phức tạp. Đôi khi tôi sử dụng kiểu chuyển từ điển trong các ngôn ngữ không phải là Haskell để mô phỏng kiểu chữ (nhưng đã học được rằng đó thường không phải là một ý tưởng tuyệt vời như âm thanh).
Tất nhiên, bất cứ khi nào có sự khác biệt về sức mạnh biểu cảm, sẽ có sự đánh đổi. Mặc dù bạn có thể sử dụng một API nhất định theo nhiều cách hơn nếu nó được viết bằng DPS, API sẽ nhận được nhiều thông tin hơn nếu bạn không thể. Một cách điều này xuất hiện trong thực tế là Data.Set
, điều này phụ thuộc vào thực tế là chỉ có một Ord
từ điển cho mỗi loại. Các Set
phần tử lưu trữ được sắp xếp theo Ord
, và nếu bạn xây dựng một bộ với một từ điển, sau đó chèn một phần tử bằng một phần tử khác, như có thể với DPS, bạn có thể phá vỡ Set
bất biến và khiến nó bị sập. Vấn đề duy nhất này có thể được giảm thiểu bằng cách sử dụng một tồn tại ảogõ để đánh dấu từ điển, nhưng, một lần nữa, với chi phí khá phức tạp khó chịu trong API. Điều này cũng xuất hiện theo cách tương tự trong Typeable
API.
Các bit duy nhất không xuất hiện rất thường xuyên. Những gì typeclass là tuyệt vời là viết mã cho bạn. Ví dụ,
catProcs :: (i -> Maybe String) -> (i -> Maybe String) -> (i -> Maybe String)
catProcs f g = f <> g
trong đó có hai "bộ xử lý" lấy đầu vào và có thể đưa ra đầu ra, và ghép chúng lại, làm phẳng đi Nothing
, sẽ phải được viết trong DPS giống như thế này:
catProcs f g = (<>) (funcSemi (maybeSemi listSemi)) f g
Về cơ bản, chúng tôi phải đánh vần loại chúng tôi sử dụng lại, mặc dù chúng tôi đã đánh vần nó trong chữ ký loại và thậm chí nó còn thừa vì trình biên dịch đã biết tất cả các loại. Bởi vì chỉ có một cách để xây dựng một kiểu nhất định Semigroup
, trình biên dịch có thể làm điều đó cho bạn. Điều này có hiệu ứng loại "lãi kép" khi bạn bắt đầu xác định nhiều trường hợp tham số và sử dụng cấu trúc của các loại để tính toán cho bạn, như trong các Data.Functor.*
tổ hợp, và điều này được sử dụng rất hiệu quả deriving via
trong đó về cơ bản bạn có thể nhận được tất cả Cấu trúc đại số "tiêu chuẩn" của loại của bạn được viết cho bạn.
Và thậm chí đừng để tôi bắt đầu với MPTC và các quỹ, những thông tin đưa thông tin trở lại vào việc đánh máy và suy luận. Tôi chưa bao giờ thử chuyển đổi một thứ như vậy sang DPS - Tôi nghi ngờ nó sẽ liên quan đến việc đưa ra rất nhiều bằng chứng về sự bình đẳng loại - nhưng trong mọi trường hợp tôi chắc chắn rằng nó sẽ giúp ích cho bộ não của tôi nhiều hơn tôi sẽ cảm thấy thoải mái với.
-
1 U nless bạn sử dụng reflection
trong trường hợp này chúng trở nên tương đương cầm quyền - nhưng reflection
cũng có thể là rườm rà để sử dụng.