我刚读这篇文章有关circular programming.这对我来说似乎很陌生.虽然我可以想象反馈是懒惰的评估thunk,将在以后评估到期望的结果,但是无法绕过它.所以我决定编写一个函数,用它的最小值替换列表中的每个元素.
trace :: (a -> c -> (b,c)) -> a -> b
trace f a = b
where (b,c) = f a c
repminList :: (Num a, Ord a) => [a] -> [a]
repminList = trace repIIminList
repIIminList [x] m = ([m], x)
repIIminList (a:as) m = let (replaced, m) = repIIminList as m
in (m : replaced, min a m)
Run Code Online (Sandbox Code Playgroud)
但repminList [1,2,3]等于[2,3,3].什么是正确的版本?
你的问题是你有两个不同的m变量和一个阴影而不是另一个,所以你根本不会使用实际的循环变量.这是你的固定版本repIIminList:
repIIminList [x] m = ([m], x)
repIIminList (a:as) m = let (replaced, m') = repIIminList as m
in (m : replaced, min a m')
Run Code Online (Sandbox Code Playgroud)
这m是您作为循环参数接收的列表的最后一个最小元素.在m'从递归调用返回repIIminList的最小值迄今所看到的,让你追加是非常重要的最终最小的值(即m)的结果列表,然后通过返回更新当前的最小值min a m'.
| 归档时间: |
|
| 查看次数: |
377 次 |
| 最近记录: |