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
相关产品推荐
相关产品推荐

