Đây là trường hợp sử dụng tuyệt vời cho applicative style. Bạn có thể thay thế toàn bộ đoạn mã của bạn (sau khi nhập Control.Applicative
) với
Node <$> numberNode x <*> numberTree t1 <*> numberTree t2
Hãy suy nghĩ về phong cách applicative (sử dụng <$>
và <*>
) là "nâng" ứng dụng chức năng để nó hoạt động trên functors là tốt. Nếu bạn tinh thần bỏ qua <$>
và <*>
, nó trông khá giống ứng dụng chức năng bình thường!
Kiểu áp dụng rất hữu ích bất cứ khi nào bạn có hàm thuần túy và bạn muốn cho đối số không đúng (hoặc bất kỳ đối số functor nào) - về cơ bản khi bạn muốn thực hiện những gì bạn đã chỉ định trong câu hỏi của mình!
Các loại chữ ký của <$>
là
(<$>) :: Functor f => (a -> b) -> f a -> f b
có nghĩa là nó có một chức năng tinh khiết (trong trường hợp này Node
) và một giá trị functor (trong trường hợp này numberNode x
) và nó tạo ra một chức năng mới bao bọc "bên trong" một hàm. Bạn có thể thêm lập luận hơn nữa để chức năng này với <*>
, trong đó có các loại chữ ký
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
Như bạn có thể thấy, đây là rất giống với <$>
chỉ nó hoạt động ngay cả khi hàm được bọc "bên trong" một functor.
Cảm ơn bạn đã đẩy đầu vào tường này. Không biết tại sao, nhưng tôi chỉ không có giải pháp đơn giản này. – floAr
Bạn được chào đón! –