【发布时间】:2017-01-19 06:12:48
【问题描述】:
我正试图绕着固定点和递归定义低头。
这行得通:
>>> take 10 $ let x = (0:x) in x
[0,0,0,0,0,0,0,0,0,0]
这做同样的事情,考虑到fix的定义,这是有道理的:
>>> take 10 $ fix (\x -> (0:x))
[0,0,0,0,0,0,0,0,0,0]
现在假设我开始使用递归定义的对:
>>> take 10 $ fst $ let (u,v) = (0:v,1:u) in (u,v)
[0,1,0,1,0,1,0,1,0,1]
好的,我应该也可以用fix 来写,对吧?
>>> take 10 $ fst $ fix (\(u,v) -> (0:v,1:u))
*** Exception: <<loop>>
但它不起作用。除非我做出以下看似微不足道的改变:
>>> take 10 $ fst $ fix (\r -> let (u,v)=r in (0:v,1:u))
[0,1,0,1,0,1,0,1,0,1]
最后两个示例之间的关键区别是什么?
【问题讨论】:
标签: haskell fixpoint-combinators