2016-09-14 48 views
8

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.

+0

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

+0

@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

+0

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

Trả lời

5

Câu hỏi 1

Bởi vì kiểu suy luận, mà chọn <$> từ g. Thật vậy, trong

Free (hoistFree f <$> f as) 

f as đã gõ g <something>, vì thế mà <$> là một do Functor g.

Câu hỏi 2

Tôi nghĩ rằng, trong Haskell, f luôn là sự chuyển hóa tự nhiên. Bất kỳ chức năng đa hình f a -> g a phải là tự nhiên trong a, theo tham số/định lý miễn phí. Cả hai định nghĩa là tương đương, tôi không chắc liệu có bất kỳ định nghĩa nào là "tốt nhất" hay không. Có thể là của bạn. Hoặc có thể bản gốc có hiệu suất tốt hơn trong thực tế. Dường như một đối số foldr so với foldl' về toán tử kết hợp, nơi không có người chiến thắng rõ ràng.

Câu hỏi 3 Không có ý tưởng.

+0

Cảm ơn câu trả lời. Nhưng ngay cả khi f luôn là một biến đổi tự nhiên về mặt toán học, có thể có một số cách không tương đương để thực hiện nó, ví dụ: [bài đăng này] (http://blog.sigfpe.com/2008/02/how-many-functions-are-there-from-to.html). – stackman

+0

@stackman True. Có thể ai đó khác có thể cung cấp thông tin chi tiết hơn. Hiểu được mức độ nghiêm ngặt chính xác của một hàm cấp cao hơn là khá khó khăn. – chi

Các vấn đề liên quan