实例定义为
ON()
但是我没有理解它背后的直观含义与被视为非确定性计算的instance MonadFix [] where
mfix f = case fix (f . head) of
[] -> []
(x:_) -> x : mfix (tail . f)
monad相比。在[]
函数mfix f
中,其参数不能严格,因此无法检查参数。并且根据定义,它也不能在其输出中的任何位置使用该参数,否则在某些时候它将命中f
并发散。那么fix (f . head)
除了mfix
之外还有mfix (const someList)
的任何用途(或很好的示例)吗?
答案 0 :(得分:3)
最简单的说法是这样的。完全定义f
的函数mfix f
是f x
的主干不依赖于x
的函数,因此它们可以以
f x = [f1 x, ..., fn x]
对于某些n
(可能是无穷大)和某些f1
,...,fn
。然后
mfix f = [fix f1, ..., fix fn]
(当然,为了真正完全定义,每个fix fi
也必须定义)。
mfix
可以被认为是不确定的,为您提供非确定性函数的固定点。相当重的限制是非确定性计算的形状不能以任何方式依赖于输入。我们似乎需要对计算进行某种限制才能开始,但您可能希望至少能够有条件地终止计算的一个分支(比如说某些中间计算是否定的)。我一直认为应该可以通过这种方式使用mfix
来使用不同的非确定性monad,其选择操作不是关联的,但从未解决过细节。
答案 1 :(得分:0)
如果您实际使用具有严格功能的fix
变体,则所有a
变体都会出现问题,但一般不是真实用例中的问题 † :f :: (Int -> Int) -> [Int -> Int]
基本上总是一个函数类型,任何lambda都已经在NF中。
所以,至于具体的使用......好吧,这里至少收敛的东西:
<德尔> f f' = [\x -> if x>0 then f' (x-1) * i else 1 | i<-[0..]]
德尔>
<德尔> f
德尔>
GHCi> take 20 $ mfix f <*> [1,2]
基本上生成一个幂函数列表。
<德尔> [0,0,1,1,2,4,3,9,4,16,5,25,6,36,7,49,8,64,9,81]
德尔>
<删除> fix (f . head)
德尔>
这对我不确定的实际有用,但确实有很有趣的行为。
我刚刚注意到这是一个糟糕的例子,因为它实际上相当于一个a -> [a]
。唔...
† 您似乎非常正确:{em> 是{{1}}的问题,因为没有明显的问题如何使列表结构依赖于参数而不严格。