Tôi có một số câu hỏi liên quan đến chức năng hoistfree từ thư viện Haskell Control.Monad.Free. Với một chuyển đổi f
giữa hai hàm, hoistfree f tạo ra một hình thái giữa các monads miễn phí tương ứng. Đây là định nghĩa của nó.Định nghĩa của hoistfree
hoistFree :: Functor g => (forall a. f a -> g a) -> Free f b -> Free g b
hoistFree _ (Pure a) = Pure a
hoistFree f (Free as) = Free (hoistFree f <$> f as)
Câu hỏi 1 như thế nào Haskell biết rằng <$>
là bản đồ liên quan đến g
và không f
, Free f
hoặc Free g
?
Câu hỏi 2 Tại sao hoistfree chưa được định nghĩa là
hoistFree :: Functor g => (forall a. f a -> g a) -> Free f b -> Free g b
hoistFree _ (Pure a) = Pure a
hoistFree f (Free as) = Free (f (hoistFree f <$> as))
?
Nếu f
là một phép biến đổi tự nhiên, hai định nghĩa này trùng với nhau. Định nghĩa thứ hai tuy nhiên luôn thỏa mãn mối quan hệ
hoistfree f = iter (wrap . f) . map return
trông khá tự nhiên. Hơn nữa, có một vài hàm cơ bản có thể được biểu diễn bằng cách sử dụng iter_map f g = iter f . map g
. Ví dụ,
(=<<) f = iter_map wrap f
Câu hỏi 3 là iter_map định nghĩa ở đâu đó? Nó trông giống như một mapreduce monadic. Tôi không thấy nó trong thư viện cơ sở. Có một số đạt được trong fusioning iter và bản đồ? Trong một vài ngôn ngữ khác, đây là trường hợp, nhưng tôi không chắc chắn cho Haskell.
Functor hạn chế về định nghĩa của bạn về 'hoistFree' là sai, phải không? Kiểu suy ra là 'Functor f => (f (Free g a) -> g (Free g a)) -> Free f a -> Free g a'. – Michael
@michael Tôi không biết tại sao loại rộng hơn không được suy ra. Đây là một bí ẩn đối với tôi. – stackman
Trình inferencer loại không suy ra thứ hạng 2, hoặc là ý bạn là gì? Đây là 'loại rộng hơn' theo nghĩa là nó áp dụng cho nhiều trường hợp hơn. – Michael