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.sequenceA
và Foldable.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 Foldable
và Functor
, và sequenceA
và traversal
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
?
'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
@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
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