首页 > 解决方案 > Haskell 中真正的非确定性

问题描述

Haskell 中有很多关于“非确定性”的说法:列表单子和Amb单子称自己是非确定性的。

但是这些函数只是模拟非确定性——它们(确定性地)产生所有可能的结果。

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

我的意思是类型的函数

nondeterministicChoice :: a -> a -> IO a

编译器在返回第一个参数还是第二个参数方面不受限制(使用它使用的相同逻辑,例如,选择是重新计算还是记忆一个 thunk)。特别有趣的是,如果结果a可能是懒惰的。

标签: haskellionon-deterministic

解决方案


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

但是,您可以使用https://stackoverflow.com/a/28701687/12153248evaluated中的函数将此函数编码为,即选择已评估的参数:

nondeterministicChoice :: a -> a -> IO a
nondeterministicChoice a b = do
  a' <-evaluated a
  if a'
    then return a
    else return b

推荐阅读