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
在 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