haskell - Haskell 中真正的非确定性
问题描述
Haskell 中有很多关于“非确定性”的说法:列表单子和Amb
单子称自己是非确定性的。
但是这些函数只是模拟非确定性——它们(确定性地)产生所有可能的结果。
如何在 Haskell 中写出真正的非确定性选择?
我的意思是类型的函数
nondeterministicChoice :: a -> a -> IO a
编译器在返回第一个参数还是第二个参数方面不受限制(使用它使用的相同逻辑,例如,选择是重新计算还是记忆一个 thunk)。特别有趣的是,如果结果a
可能是懒惰的。
解决方案
我认为答案是——所问的问题毫无意义。简单地释放编译器做这样的事情是没有意义的,因为它不知道如何处理它。(当前)编译器中没有逻辑可以决定哪个参数更好用。
但是,您可以使用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
推荐阅读
- python - 为什么这个python类中的`default`是一个flake8错误?
- facebook-graph-api - 使用 Facebook Graph API 自己获取所有评论
- vba - VBA,GetPageNumber 不起作用
- reactivesearch - ReactiveBase 标头
- python - 单元测试错误:py.test WinError5
- r - 使用 xlsx 包覆盖 xlsm 文件中的单元格引用
- php - Laravel 事件更新导致 SQL 崩溃
- class - 改变一个对象的属性,改变所有,为什么?
- hybris - 如何获得应用于购物车的折扣总额
- docker - Docker - Windows 容器无法解析主机