Haskell 程序员提到非确定性时是什么意思?我读到列表 monad 可用于建模 非确定性,但列表肯定不是非确定性的吗?对非确定性建模意味着什么?据我所知,这只是意味着为一组计算返回一组所有可能的结果。
最佳答案
你的理解是正确的。列表 monad 捕获的不确定性确实处理可以返回多个可能结果的计算(函数)。
也就是说,一个计算f
从类型A
的输入非确定性地计算类型B
的输出然后在Haskell中由一个函数表示将 A
类型的值列表 B
类型的值:
f :: A -> [B]
然后,如果我们也有计算 g
,它——同样是非确定性的——根据 B
类型的输入计算 C
类型的输出,
g :: B -> [C]
我们可以组合这些计算以获得组合计算h
,它将A
类型的输入与C
类型的输出相结合:
h :: A -> [C]
在 Haskell 中,定义这样一个函数 h
涉及将函数 g
应用于应用程序 f x
的每个可能结果,然后将 thus 展平获得 h
的可能结果列表列表:
h x = concat zs where zs = [g y | y <- f x]
正是这种组合被list monad捕获,允许你写:
h x = f x >>= g
甚至
h = f >=> g
关于haskell - Haskell 中的非确定性是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27265920/