Haskell 为什么列表函子表示非确定性选择的上下文?

Haskell 为什么列表函子表示非确定性选择的上下文?,haskell,functional-programming,Haskell,Functional Programming,这句话是什么意思 the list functor represents a context of nondeterministic choice; 在函数式编程中的函子上下文中 我想我理解函子是某种“容器”,它能够将函数统一应用于容器中的元素而不改变结构。所以,可能是一个函子,它代表一个可能失败的上下文或容器,但为什么列表代表一个选择不确定的上下文或容器呢?据我所知,如果一个计算有多个可能的答案,它就是“不确定的”。一个列表可以包含多个可能的答案。这就是为什么 (至于为什么称之为不确定性,我

这句话是什么意思

the list functor represents a context of nondeterministic choice;
在函数式编程中的函子上下文中


我想我理解函子是某种“容器”,它能够将函数统一应用于容器中的元素而不改变结构。所以,可能是一个函子,它代表一个可能失败的上下文或容器,但为什么列表代表一个选择不确定的上下文或容器呢?

据我所知,如果一个计算有多个可能的答案,它就是“不确定的”。一个列表可以包含多个可能的答案。这就是为什么

(至于为什么称之为不确定性,我不知道……我本以为不确定性是指随机的,这是完全不同的。)

“经典”计算取1个输入,给出1个输出。 你想用这些非确定性计算来表示的是:如果我对输入不确定,我能对输出说些什么

表示不确定性的两种常用方法是:

  • 输入是给定集合的一个元素
  • 输入由已知的概率分布给出
  • 作为一个例子,考虑加倍它输入的函数(2 *)。 当输入是模辊的结果时,您能对该函数的输出说些什么

  • 我知道模具有6个面,所以结果在集合{2,4,6,8,10,12}中
  • 我知道每个人脸的概率是1/6,所以我知道每个数字出现的概率是1/6

  • 列表函子表示1意义上的非确定性计算。它表示列表集合。

    考虑以下几点:

    foo = do
      x <- [1 .. 10]
      y <- [2, 3, 5, 7]
      return (x * y)
    
    foo=do
    
    传统上,在可计算性和复杂性方面,非确定性计算模型指的是一个模型,在这种情况下,您可以“分支”。维基百科是这样解释的:

    在计算复杂性理论中,非确定性算法是指在每一个可能的步骤中都能允许多重连续性的算法(想象一个人在森林中沿着一条小路走,每次他再往前走,他必须选择他希望走的路的哪个岔口)。这些算法并不是针对每一条可能的计算路径都能得到一个解;但是,它们保证能够为某些路径找到正确的解决方案(即,穿过森林的人只有在选择一些“正确”路径的组合时才能找到自己的小屋)。在搜索过程中,这些选择可以解释为猜测

    在单子列表中,这正是你正在做的。例如,考虑这个解决方案的决策版本,在清单MaNad:

    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)
    
    cliques::Int->Graph->[[Node]]
    派系0[u=[]]
    cliques minCliqueSize graph=do
    
    v除了将函子视为容器外,还可以将其视为某种上下文。您的值在该上下文中,如果您想对其进行操作,可以使用
    map
    将函数提升到上下文中。另一种说法是,你的价值观会随着上下文而增加

    为了理解列表函子是如何成为非确定性选择的上下文,了解另一个函子是如何成为上下文可能很有用:Maybe函子是可能失败的计算的上下文。如果您尝试将函数应用于Maybe函子中的值,则结果值仍将保持相同的上下文,即它是否首先是一个失败的计算

    同样,列表可以被视为计算的结果,该计算没有确定的结果,但其结果可以从多个值中不确定地选择。如果您试图将一个函数映射到一个包含3个元素的列表上,这些元素将被更改,但是能够在三个值之间进行选择的上下文将保持不变

    借用Dan Burtons的答案,看看列表的一元符号:

    foo = do
      x <- [1 .. 10]
      y <- [2, 3, 5, 7]
      return (x * y)
    
    foo=do
    
    x=
    ,上下文可以更改,而对于函子和
    映射
    ,则不能更改。

    不确定性不是纯粹的随机性,它是在特定选项之间进行任意选择。建立不确定性模型的一种方法是做出所有可能的选择(列表可用于此模型),尽管通常,当我们谈论一台不确定性机器时,它只会做出一个选择,我们无法预测它会做出什么选择,尽管我们确切地知道它会做出什么选择。是的:在引用的意义上,列表被用作廉价的多集,通过保留所有可能的结果来表示“非确定性选择”。如果它有帮助的话,这与NFA(非确定性有限状态自动机)或NTM(非确定性图灵机)中的“非确定性”是一样的。是的,我知道NTM,这显然是这个术语的来源。我只是不明白为什么它被称为“不确定性”,因为它确实遵循既定的规则。我怀疑TM对不确定性的定义实际上早于“随机”解释。这段引语来自哪里?我听说过列表单子代表不确定的选择,但不是列表函子。引用自:“因此使用单子和>>=,上下文可以更改”你能详细说明一下吗
    (>>=)::Monad m=>ma->(a->mb)->mb
    表示必须保留上下文
    m
    。或者你所说的上下文是指
    a
    ,在你的例子中是一个列表
    [a]
    ?是的,它是上下文的形状。如果你映射到一个列表,它会保持相同数量的项目,如果你映射到一个Maybe,它会保持为Just或Nothing。但是如果您使用,
    >=
    ,那么您可以更改列表中的元素数量,并且您可以将a Just更改为nothing。其他单子也是如此。但这只是看待monad的一种方式,还有其他monad将其视为具有给定结构的数据值(例如IO)是没有意义的