Tôi đã cố gắng "tìm hiểu tôi một Haskell" thông qua cuốn sách trực tuyến LYAH.một sự tổng quát đơn giản của lớp loại ứng dụng (Functor); phù hợp với mô hình trên các nhà xây dựng
Tác giả mô tả hành vi của Functors of the Applicative type là loại có khả năng trích xuất một hàm từ một functor và ánh xạ nó trên một hàm thứ hai; này là thông qua việc < *> chức năng kê khai kiểu lớp applicative:
class (Functor f) => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
Là một ví dụ đơn giản, kiểu lẽ là một thể hiện của applicative dưới thực hiện như sau:
instance Applicative Maybe where
pure = Just
Nothing <*> _ = Nothing
(Just f) <*> something = fmap f something
Một ví dụ về hành vi đã đề cập trước:
ghci> Just (*2) <*> Just 10 -- evaluates to Just 20
nên < *> điều hành "chiết xuất" các (* 2) chức năng từ các toán hạng đầu tiên và bản đồ nó trên toán hạng thứ hai.
Bây giờ trong các loại ứng dụng, cả hai toán hạng < *> đều có cùng loại, vì vậy tôi nghĩ là tập thể dục tại sao không thử thực hiện khái quát hóa hành vi này, trong đó hai toán hạng là Functors của các loại khác nhau đánh giá một cái gì đó như thế này:
Just (2*) <*:*> [1,2,3,4] -- should evaluate to [2,4,6,8]
Vì vậy, đây là những gì tôi đã đưa ra:
import Control.Applicative
class (Applicative f, Functor g) => DApplicative f g where
pure1 :: a -> f a
pure1 = pure
(<*:*>) :: f (a -> b) -> g a -> g b -- referred below as (1)
instance DApplicative Maybe [] where -- an "instance pair" of this class
(Just func) <*:*> g = fmap func g
main = do putStrLn(show x)
where x = Just (2*) <*:*> [1,2,3,4] -- it works, x equals [2,4,6,8]
Bây giờ, mặc dù các công trình trên, tôi đang tự hỏi nếu chúng ta có thể làm tốt hơn; là nó có thể cung cấp cho một thực hiện mặc định cho < *: *> có thể được áp dụng cho một loạt các f & g cặp, trong tuyên bố cho DApplicative f g chính nó? Và điều này dẫn tôi đến câu hỏi sau: Có cách nào để khớp mẫu trên các nhà xây dựng trên các loại dữ liệu khác nhau không?
Tôi hy vọng câu hỏi của mình có ý nghĩa và tôi không chỉ phun vô nghĩa (nếu tôi, xin đừng quá khắc nghiệt; Tôi chỉ là người mới bắt đầu FP lên đường trước giờ đi ngủ của mình ...)
cảm ơn câu trả lời toàn diện ... Tôi chưa đọc kỹ mã của bạn, nhưng tôi có ý tưởng chung. – Aky