haskell - 在 Haskell 中计算近似值的生成器、选择器模式
问题描述
我正在尝试实现一个生成器,选择器模式来近似计算haskell中的平方根
我的生成器如下所示:
generator :: (Double -> Double) -> Double -> [Double]
generator f a = generator f (f a)
我的选择器:
selector :: Double -> [Double] -> Double
selector eps (a : b : r)
| abs(a - b) <= eps = b
| otherwise = selector eps (b : r)
和近似函数:
next :: Double -> Double -> Double
next n x = (x + n/x) / 2
像这样调用selector 0.1 (generator (next 5) 2)
应该给我...(next 5( next 5 (next 5 2)))
,[2.25, 2.23611111111111, 2.2360679779158,...]
因为我的 eps 参数是 0.1abs(a - b) <= eps
在第一次执行时应该是真的,2.23611111111111
结果给我。然而,我确实以无限循环结束。
有人可以向我解释这些功能的实现有什么问题吗?
提前致谢
解决方案
这个定义
generator f a = generator f (f a)
永远不会生成任何列表元素:相反,它会陷入无限递归。你可能想要
generator f a = a : generator f (f a)
它a
是第一个元素,然后是我们使用递归生成的所有其他元素。
避免将未评估的 thunk 放入列表中也可能是有益的。为避免这种情况,可以使用
generator f a = a `seq` (a : generator f (f a))
所以a
早期评估。这在您的代码中应该无关紧要,因为选择器会在生成 thunk 后立即对其进行评估。
推荐阅读
- mdx - IcCube - 在 icCube 表中显示行号
- android - 在没有堆栈跟踪的情况下调试 Android 崩溃
- cassandra - 如何在 cqlsh 中查看 apache cassandra 的实际配置值?
- asp.net-core - 如何覆盖注销后重定向网址
- c# - 如何使用 SessionId 获取会话?
- python - 如何在 SQLAlchemy - Python 中使用不同的过滤器进行计数
- c++ - 我对函数中返回多个值的指针感到困惑,C/C++
- react-native - MDM 如何限制对公共版本应用程序的访问?
- json - 将 URL 重定向到 Ghost CMS redirects.json 中具有相同路径的另一个域
- python - 如何将 csv 文件中的值添加到列表中?