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

Haskell用列表推导式实现Gregory-Leibnitz函数GHC报错如何解决?

你的初步判断不准确,报错的核心原因是误用了列表推导式的<-语法。

列表推导式中<-的作用是从右侧的可遍历结构(比如列表)中逐个取出元素赋值给左侧变量,你写x <- (num n)/(den n)相当于要把Double类型的计算结果当成列表遍历,GHC顺着这个错误的用法推导类型,才会出现一堆和[Double]实例相关的报错。

正确的改写方案如下:

gregoryleibniz :: [Double]
gregoryleibniz = [4 * num n / den n | n <- [0..] :: [Integer]]
    where 
        num n = fromIntegral $ (-1) ^ n
        den n = fromIntegral $ 2 * n + 1

改动说明:

  • 直接把每一项的计算逻辑放在列表推导式的头部,去掉了错误的x <-绑定和外层的冗余map调用
  • 给[0..]增加了:: [Integer]类型标注,明确变量n的类型为Integer,解决类型推断歧义
  • 增加了fromIntegral调用,把Integer类型的计算结果转换为适配除法运算的数值类型,符合Double的输出要求

如果你希望保留原来的mul函数拆分结构,也可以写成下面的版本:

gregoryleibniz :: [Double]
gregoryleibniz = map mul [num n / den n | n <- [0..] :: [Integer]]
    where 
        mul x = 4 * x
        num n = fromIntegral $ (-1) ^ n
        den n = fromIntegral $ 2 * n + 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 11:36:02