Giả sử tôi có kiểu dữ liệu A
là ứng dụng. (Vì lợi ích của ví dụ, chúng ta có thể giả định A
là Identity
).Ví dụ ứng dụng cho các chức năng từ cùng một tên miền đến số
bây giờ tôi có một kiểu dữ liệu mới tương ứng với "chuyển đổi" từ một A
khác:
data B a b = B (A a -> A b)
Tôi muốn xác định các trường hợp applicative tầm thường cho (B a)
đó tạo ra một sự biến đổi mới mà áp dụng cho cả đối số của <*>
đến đầu vào của nó và sau đó sử dụng định nghĩa của < *> từ dụ applicative của A.
Xây dựng này là đủ đơn giản:
instance Applicative (B a) where
pure x = B $ const $ pure x
(B ftrans) <*> (B xtrans) = B fxtrans
where fxtrans inp = let fout = ftrans inp
xout = xtrans inp
in fout <*> xout
Tuy nhiên, tôi có cảm giác rằng phải có một cách đơn giản không cần thiết để viết điều này bằng cách sử dụng thực tế là (-> a)
là một hàm Functor.
Là một mẫu của những gì tôi có trong tâm trí, hãy xem xét định nghĩa của tôi về trường hợp functor tương ứng:
instance Functor (B a) where
fmap f (B xtrans) = B $ (fmap f) <$> xtrans
Có một cách đơn giản tương tự để xác định các trường hợp applicative?
Sẽ đúng khi nói rằng 'B a b' trong câu hỏi tương đương với' loại B a = Soạn ((->) (A a)) A'? –
@ChristianConkle: Có. –