2012-04-18 18 views
11

Trích dẫn này có ý nghĩa gì?Tại sao functor danh sách đại diện cho một bối cảnh của sự lựa chọn không xác định?

the list functor represents a context of nondeterministic choice; 

Trong ngữ cảnh của Functors trong lập trình hàm.

Tôi nghĩ rằng tôi hiểu rằng một Functor là một "container" của một số loại cùng với khả năng áp dụng một chức năng thống nhất cho các thành phần trong container mà không thay đổi cấu trúc. Vì vậy, có thể là một Functor đại diện cho một bối cảnh hoặc container với thất bại có thể, nhưng tại sao danh sách đại diện cho một bối cảnh hoặc container với sự lựa chọn không xác định?

+2

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

+0

Trích dẫn là từ: http://www.haskell.org/haskellwiki/Typeclassopedia#Instances – groodt

Trả lời

11

Tốt nhất tôi có thể nói, phép tính là "không xác định" nếu có nhiều câu trả lời có thể. Vâng, một danh sách có thể chứa nhiều câu trả lời có thể. Vì vậy đó là lý do tại sao.

(Là tại sao nó được gọi là không xác định, tôi không có ý tưởng ... Tôi đã có dự kiến ​​không xác định nghĩa ngẫu nhiên, mà là một cái gì đó hoàn toàn khác nhau.)

+9

Nondeterminism không phải là ngẫu nhiên thuần túy, nó đang tạo sự lựa chọn tùy ý giữa các tùy chọn cụ thể. Một cách để mô hình hóa tính không xác định là tạo tất cả các lựa chọn có thể (và danh sách có thể được sử dụng cho mô hình này), mặc dù thông thường, khi chúng ta nói về một máy không xác định, nó chỉ tạo ra một lựa chọn, và chúng ta không thể dự đoán lựa chọn nó sẽ tạo ra, mặc dù chúng tôi biết chính xác lựa chọn mà nó * có thể * thực hiện. –

+2

Có: theo nghĩa của báo giá, danh sách được sử dụng như là một multiset thuê thấp, và đại diện cho "sự lựa chọn không xác định" bằng cách giữ mọi kết quả có thể. – comingstorm

+4

Nếu nó giúp gì cả, điều này cũng giống như "không xác định" như trong một NFA (automata hữu hạn không xác định) hoặc một NTM (máy Turing không xác định). –

4

"cổ điển" tính toán mất 1 đầu vào và cung cấp cho 1 đầu ra. Điều bạn muốn đại diện với các tính toán không xác định này là: Tôi có thể nói gì về đầu ra nếu tôi không chắc về đầu vào?

Hai cách thông thường để đại diện cho sự không chắc chắn là cần cân nhắc:

  1. mà đầu vào là một phần tử của một cho thiết
  2. rằng các đầu vào được đưa ra bởi một phân bố xác suất gọi

Ví dụ, hãy xem xét hàm (2 *) để tăng gấp đôi đầu vào. Bạn có thể nói gì về đầu ra của hàm đó khi đầu vào là kết quả của cuộn chết?

  1. Tôi biết chết có 6 khuôn mặt sao cho kết quả là trong tập {2,4,6,8,10,12}
  2. Tôi biết xác suất của mỗi mặt là 1/6 vì vậy tôi biết rằng mỗi số này có xác suất 1/6 xuất hiện

Danh sách functor đại diện cho tính toán không xác định theo nghĩa 1: nó đại diện cho các bộ theo danh sách.

4

xem xét như sau:

foo = do 
    x <- [1 .. 10] 
    y <- [2, 3, 5, 7] 
    return (x * y) 

là gì foo? Vâng, đó là x * y, trừ trường hợp được lựa chọn không xác định của x là một số từ 1 đến 10, và y là một trong hai 2, 3, 5, hoặc 7. Do đó, foo là [2, 3, 5, 7, 4, 6, 10, 14, etc... ]

8

Theo truyền thống, trong computability và phức tạp, một mô hình tính toán không xác định đã đề cập đến một mô hình trong trường hợp đó bạn có thể "phân nhánh". Wikipedia giải thích nó như vậy:

Trong lý thuyết độ phức tạp tính toán, thuật toán không xác định là những người mà, tại mỗi bước có thể, có thể cho phép nhiều continuations (tưởng tượng một người đàn ông đi bộ xuống một con đường trong một khu rừng và, mỗi khi ông bước hơn nữa, anh ta phải chọn cái nĩa nào trên con đường mà anh ta muốn dùng).Các thuật toán này không đi đến giải pháp cho mọi đường dẫn tính toán có thể có; tuy nhiên, họ được đảm bảo đến một giải pháp chính xác cho một số con đường (tức là, người đàn ông đi qua khu rừng chỉ có thể tìm thấy cabin của mình nếu anh ta chọn một số kết hợp các đường dẫn "chính xác"). Các lựa chọn có thể được hiểu là dự đoán trong quá trình tìm kiếm.

Trong danh sách đơn lẻ, đây chính xác là những gì bạn đang làm. Ví dụ, hãy xem xét giải pháp này lên phiên bản Quyết định của clique problem, trong danh sách các đơn nguyên:

cliques :: Int -> Graph -> [[Node]] 
cliques 0 _ = [[]] 
cliques minCliqueSize graph = do 
    v <- nodes graph 
    vs <- cliques (minCliqueSize - 1) (deleteNode v graph) 
    mapM_ (\ w -> guard (isAdjacent v w graph)) vs 
    return (v:vs) 

Đây chính là cách bạn muốn chương trình ví dụ một máy Turing không xác định để giải quyết vấn đề clique.

5

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ụ, xy 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ể.

+0

_ "Vì vậy, với monads và >> =, bối cảnh có thể thay đổi" _ Bạn có thể giải thích điều đó không? '(>> =) :: Monad m => m a -> (a -> m b) -> m b' cho biết rằng ngữ cảnh' m' phải được giữ nguyên. Hoặc bạn có ý nghĩa bởi bối cảnh hình dạng của 'a', mà là một List' [a] 'trong ví dụ của bạn? – ftor

+1

Vâng, đó là hình dạng của bối cảnh. Nếu bạn lập bản đồ trên một danh sách, nó sẽ giữ cùng một số mục và nếu bạn ánh xạ trên Có thể, nó sẽ là một Chỉ hoặc Không có gì. Nhưng nếu bạn sử dụng, '>> =' thì bạn có thể thay đổi số lượng các phần tử trong danh sách, và bạn có thể thay đổi một chỉ thành một cái gì đó. Và tương tự cho các monads khác. Nhưng nó chỉ là một cách để nhìn vào monads, có những monads khác mà nó không thực sự có ý nghĩa để nhìn vào nó như là một giá trị dữ liệu với một cấu trúc nhất định, ví dụ IO. – Boris

+0

'<*>'/'>> =' không thể luôn giữ hình dạng của bối cảnh vì chúng kết hợp hai ngữ cảnh. Và 'pure' /' return' đến để giải cứu bằng cách cung cấp một ngữ cảnh tối thiểu kết hợp với một ngữ cảnh khác được đảm bảo không làm thay đổi hình dạng của ngữ cảnh đó. 'pure' /' return' là cần thiết vì luật áp dụng/đơn nguyên. Cuối cùng tôi đã hiểu nó: D – ftor

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