Haskell 中的真正不确定性

True nondeterminism in Haskell

在 Haskell 中有很多关于 'nondeterminism' 的说法:列表 monad 和 Amb monad 自称是非确定性的。

但这些函数只是 模型 不确定性 - 它们(确定性地)生成 所有 可能的结果。

如何在 Haskell 中写出 真正 不确定的选择?

我指的是

类型的函数
nondeterministicChoice :: a -> a -> IO a

编译器在 return 第一个或第二个参数方面不受约束(使用与它使用的相同的逻辑,例如,选择是否重新计算或记忆一个 thunk)。如果结果 a 可能是惰性的,那将特别有趣。

我认为答案是 - 问的问题毫无意义。简单地释放 编译器做这样的事情是没有意义的,因为它不知道如何处理它。编译器中(目前)没有逻辑可以决定使用哪个参数更好。

但是,您可以将此函数编码为,即使用 :

中的 evaluated 函数,选择一个已经计算过的参数
nondeterministicChoice :: a -> a -> IO a
nondeterministicChoice a b = do
  a' <-evaluated a
  if a'
    then return a
    else return b