2016-03-08 22 views
5

Trong khi nghiên cứu sâu hơn Applicative tôi đến Traversable, mặc dù tôi đã biết Foldable từ LYHGG, tôi chưa từng thấy trước đây, vì vậy tôi bắt đầu đọc Haskell wiki about Traversable.có thể gập lại vs traversable

Trong khi đọc, tôi hiểu tại sao Foldable.fold song song với Traversable.sequenceAFoldable.foldMap song song với Traversable.traverse.

Tôi đã nhìn thấy cũng rằng mỗi Traversable cũng là một FoldableFunctor, và sequenceAtraversal có thực hiện mặc định về nhau:

traverse f = sequenceA . fmap f 
sequenceA = traverse id 

Vì vậy, như tôi đã thấy trong LYHGG rằng foldMap là định nghĩa hoàn chỉnh tối thiểu cho Foldable, tôi nghĩ rằng, nó song song với traverse, vì vậy fold (song song với sequenceA) cũng sẽ là một định nghĩa hoàn chỉnh tối thiểu (không phải) ... Foldable không phải là Functor như Traversable là, vì vậy chúng ta không thể áp dụng điều này:

foldMap f = fold . fmap f 
fold = foldMap id -- this is ok 

Tại sao không phải là mỗi Foldable một Functor, và đó sẽ là một thể hiện của Foldable mà thực sự không phải là một Functor?

+4

'Set' là một ví dụ cổ điển của một' Có thể gập lại' không phải là 'Functor'. Vì vậy, là các vectơ không hộp. – dfeuer

+0

@dfeuer Tôi sẽ đọc thêm về 'Set' để hiểu tại sao nó không phải là một' Functor', nhưng, Sets có thể được coi là những thứ không lặp lại ... Điều đó đang được nói, tôi không thể tìm ra một cách nhanh chóng tại sao nó không phải là một cá thể 'Functor' ... – FtheBuilder

+1

Vấn đề là 'Functor' không cho phép triển khai cơ hội hạn chế các đối số kiểu của chúng. Hãy tưởng tượng nếu ai đó đã viết 'fmap f s' trong đó' f :: Int -> Integer -> Integer'. Kiểu 'Integer -> Integer' không phải là một thể hiện của' Eq', hãy để một mình 'Ord', vì vậy không có cách nào để kiểm tra các bản sao khi ánh xạ. Hàm có thể ánh xạ nhiều phần tử đến các hàm giống hệt nhau và bạn không có cách nào thu gọn các bản sao. – dfeuer

Trả lời

6

Như dfeuer nói, Set là ví dụ hay về Foldable không phải là Functor.

Hãy xem xét các loại Set.map:

map :: Ord b => (a -> b) -> Set a -> Set b 

Chú ý rằng đây là gầnfmap, nhưng nó đòi hỏi thêm Ord b hạn chế. Vì bạn có ràng buộc này, nó không thể được thực hiện một thể hiện của Functor.

Lưu ý rằng Set không phải là một hàm trên Haskell, ngay cả với giới hạn này. Được thiết lập khéo léo Eq trường hợp chúng tôi có thể vi phạm pháp luật fmap f . fmap g === fmap (f . g). Xem này câu hỏi stack overflow để thảo luận đa dạng hơn:

Sets, Functors and Eq confusion

Như đã trình bày ở đó, Set một (endo) functor trên "tiểu thể loại của Hask" với các kiểu ra lệnh như bộ và với bản đồ để bảo quản làm hình thái.

Vì vậy, ngay cả khi nó không rõ ràng, thực tế là chúng tôi không thể thực hiện Set một functor thực sự gợi ý một vấn đề toán học chính hãng và không chỉ là một giới hạn của máy móc typeclass của chúng tôi.

+0

những gì tôi nghĩ rằng đó là tuyệt vời là toán học nó là một 'Functor' nhưng vì ràng buộc này nó không thể là một' instance' của 'Functor' typeclass ... Bạn có nghĩ rằng điều này giống như một" imperfection "trong ngôn ngữ? (Ngôn ngữ thực sự đẹp, súc tích và mạnh mẽ, dù sao!) – FtheBuilder

+0

@FtheBuilder Tôi đã chỉnh sửa câu trả lời của mình để mô tả thêm ngữ cảnh. – sclv

+0

Tôi biết tôi không nên nói "Cảm ơn" trong một lời nhận xét, nhưng thực sự, các giải thích của bạn rất thú vị! : D – FtheBuilder

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