如何在Haskell列表推导中仅在测试成功后返回变量,避免假值?
优化Haskell列表推导:避免设置假值筛选
针对你提供的代码,我们可以通过拆分b的生成逻辑为条件绑定的生成器,彻底避免设置假值0,同时不重复计算判定条件,保持性能:
primL :: [Int] primL = [2*(m^2+n^2) + 2*b | m <- [2..12909], n <- [1..m-1], m > n, odd (m+n), gcd m n == 1, -- 打包两种b的可能取值与对应判定条件 (b, cond) <- [(2*m*n, 4*m*n == m^2+n^2+1 || 4*m*n == m^2+n^2-1), (m^2-n^2, 2*(m^2-n^2) == m^2+n^2+1 || 2*(m^2-n^2) == m^2+n^2-1)], -- 仅保留条件成立的情况 cond ]
思路说明
- 将两种合法的
b取值,分别与对应的判定条件打包成元组,作为列表推导的一个新生成器 - 遍历这个元组列表时,只有当
cond为True时,才会进入后续的计算逻辑 - 全程不需要给
b设置默认假值,也不会重复计算判定条件——每个条件仅对应自身的b计算一次,性能与原代码一致
这种写法完全符合需求:测试失败时直接跳过当前分支,测试成功时才绑定对应的b值。
内容的提问来源于stack exchange,提问作者Alfy B
相关产品推荐
相关产品推荐

