You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
]

思路说明

  1. 将两种合法的b取值,分别与对应的判定条件打包成元组,作为列表推导的一个新生成器
  2. 遍历这个元组列表时,只有当cond为True时,才会进入后续的计算逻辑
  3. 全程不需要给b设置默认假值,也不会重复计算判定条件——每个条件仅对应自身的b计算一次,性能与原代码一致

这种写法完全符合需求:测试失败时直接跳过当前分支,测试成功时才绑定对应的b值。

内容的提问来源于stack exchange,提问作者Alfy B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 13:12:36