Ngoài việc xem functor làm vùng chứa, bạn cũng có thể xem nó như một loại ngữ cảnh nhất định. Giá trị của bạn nằm trong ngữ cảnh đó và nếu bạn muốn vận hành chúng, bạn sử dụng map
để nâng một hàm vào ngữ cảnh. Một cách khác để đặt nó là giá trị của bạn được tăng cường với ngữ cảnh đó.
Để hiểu cách functor danh sách là ngữ cảnh của sự lựa chọn không xác định, có thể hữu ích để xem cách functor khác là một ngữ cảnh: The functor Có thể là ngữ cảnh của một phép tính có thể thất bại. Nếu bạn cố gắng áp dụng một hàm cho một giá trị trong hàm functor có thể, giá trị kết quả sẽ vẫn giữ nguyên ngữ cảnh của việc tính toán không thành công ở vị trí đầu tiên hay không.
Trong cùng một cách, danh sách có thể được xem là kết quả của phép tính không có kết quả xác định, nhưng kết quả có thể được chọn không xác định từ một trong nhiều giá trị. Nếu bạn cố gắng ánh xạ một hàm trên danh sách có 3 phần tử, các phần tử đó sẽ được thay đổi, nhưng ngữ cảnh có thể chọn giữa ba giá trị sẽ vẫn giữ nguyên.
Vay một chút từ Dan Burtons câu trả lời, nhìn vào các ký hiệu monadic cho các danh sách:
foo = do
x <- [1 .. 10]
y <- [2, 3, 5, 7]
return (x * y)
Có vẻ như lúc đầu hơi lạ, vì các ký hiệu dường như chỉ ra rằng bạn có thể trích xuất một giá trị duy nhất từ mỗi danh sách, nhưng sau đó bạn nhận được kết quả là một danh sách dài 40 phần tử. Nó có ý nghĩa hơn khi bạn nhìn vào các functors (tốt, monads trong trường hợp này) như là một bối cảnh cho một giá trị duy nhất. Trong ví dụ, x
và y
là những giá trị như vậy, nhưng ngữ cảnh của chúng là chúng không xác định được. Khi bạn nhân hai giá trị như vậy, bạn càng nhận được nhiều điều không xác định, dẫn đến một danh sách dài hơn. Vì vậy, với monads và >>=
, bối cảnh có thể được thay đổi, trong khi với functors và map
, nó không thể.
Trích dẫn này từ đâu? Tôi đã nghe nói về danh sách _monad_ đại diện cho sự lựa chọn không xác định, nhưng không phải là danh sách _functor_. – ivanm
Trích dẫn là từ: http://www.haskell.org/haskellwiki/Typeclassopedia#Instances – groodt