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

Haskell新手求助:素数判断函数中sqrt n报错问题

素数判断函数的问题分析与修复

问题所在

你的代码中sqrt n部分引发类型错误,导致编译失败。

错误缘由

Haskell是强类型语言:

  • sqrt函数的参数和返回值都是Floating类型(比如Double),但你的n是Int类型,直接传入sqrt会触发类型不匹配;
  • 列表推导式中[2.. x]要求x是Integral类型(比如Int),即便sqrt n能运行,返回的浮点数也无法作为整数列表的范围上限。
    另外,原代码未处理n<=1的边界情况,这类数本身不是素数,会导致错误判断。

修改方案

调整类型转换逻辑,并补充边界判断,修改后的代码如下:

isprime' :: Int -> Bool           
isprime' n 
  | n <= 1    = False
  | l == []   = True
  | otherwise = False
  where 
    maxDivisor = floor (sqrt (fromIntegral n))
    l = [x | x <- [2..maxDivisor], mod n x == 0]

关键修改点说明

  1. 边界处理:新增n<=1的分支,直接返回False,排除非素数的边界值;
  2. 类型转换:
    • 用fromIntegral n将Int类型的n转换为Floating类型,满足sqrt的参数要求;
    • 用floor将平方根的浮点数结果转换为Int类型,作为整数列表的上限;
  3. 逻辑保持:列表推导式的核心判断逻辑不变,仅修正了范围上限的类型问题。

内容的提问来源于stack exchange,提问作者João Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:00:21