List 在Haskell中实现余弦定律?

List 在Haskell中实现余弦定律?,list,function,haskell,list-comprehension,trigonometry,List,Function,Haskell,List Comprehension,Trigonometry,所以我想用这个公式创建我自己的余弦函数: 只要函数的绝对值大于0.001,该函数就应返回该值 然而,我的代码似乎有一些类型错误,我只是不知道如何修复。我已经尝试过将所有类型更改为双精度,但仍然不起作用 fac :: Int -> Int fac n = if (n == 0) then 1 else n * fac (n-1) cos :: Double -> Double cos x = sum [cos| k <- [0..], let

所以我想用这个公式创建我自己的余弦函数:

只要函数的绝对值大于0.001,该函数就应返回该值

然而,我的代码似乎有一些类型错误,我只是不知道如何修复。我已经尝试过将所有类型更改为双精度,但仍然不起作用

fac :: Int -> Int
fac n = if (n == 0) then 1 else n * fac (n-1)

cos :: Double -> Double
cos x = sum [cos| k <- [0..],
                  let cos = (-1) * (x^(2*k) `div` fac (2*k)) , 
                  abs (cos) > 0.001]
这就是错误:

•无法将预期类型“Double”与实际类型“Int”匹配


•在“div”的第二个参数中,即“fac 2*k”

这里基本上有两个问题:

div用于整数除法,即接受整数输入,并仅通过向下舍入生成整数输出。您需要/进行浮点除法。 fac返回一个Int,在除法中使用之前,必须将其显式转换为浮点数。许多语言自动从整数类型转换为浮点类型,但Haskell不这样做。可以使用fromIntegral进行转换。 解决这两件事,除此之外,我们得到:

fac :: Int -> Int
fac n = if (n == 0) then 1 else n * fac (n-1)

cos :: Double -> Double
cos x = sum [cos| k <- [0..],
                  let cos = (-1) * (x^(2*k) / fromIntegral (fac (2*k))) , 
                  abs (cos) > 0.001]
此类型检查,尽管它还有几个其他问题,按从最重要到最不重要的顺序进行:


您可能希望Haskell会神奇地知道,一旦abs cos出现,这里基本上有两个问题:

div用于整数除法,即接受整数输入,并仅通过向下舍入生成整数输出。您需要/进行浮点除法。 fac返回一个Int,在除法中使用之前,必须将其显式转换为浮点数。许多语言自动从整数类型转换为浮点类型,但Haskell不这样做。可以使用fromIntegral进行转换。 解决这两件事,除此之外,我们得到:

fac :: Int -> Int
fac n = if (n == 0) then 1 else n * fac (n-1)

cos :: Double -> Double
cos x = sum [cos| k <- [0..],
                  let cos = (-1) * (x^(2*k) / fromIntegral (fac (2*k))) , 
                  abs (cos) > 0.001]
此类型检查,尽管它还有几个其他问题,按从最重要到最不重要的顺序进行:


您可能希望Haskell会神奇地知道,一旦abs cos Well abs cos>0.001是一个过滤器,它就不是一个停止条件,这将继续产生值,但只会在abs cos>0.001时删除这些值,这样您就会陷入无限循环中?您当前的方法不会终止;它将永远尝试k值,寻找足够大的cos值,而不知道它永远不会找到另一个。您需要使用takeWhile。@codingbudge:我认为最好使用takeWhile,并使用一些列表处理函数,而不是列表理解hmm。。。泰勒级数展开。作业问题?@scootermefecit不,我正在尽可能多地练习。周六写我的编程考试:abs cos>0.001是一个过滤器,它不是一个停止条件,这将继续产生值,但只在abs cos>0.001时删除这些值,这样你就会陷入无限循环?你当前的方法不会终止;它将永远尝试k值,寻找足够大的cos值,而不知道它永远不会找到另一个。您需要使用takeWhile。@codingbudge:我认为最好使用takeWhile,并使用一些列表处理函数,而不是列表理解hmm。。。泰勒级数展开。作业问题?@scootermefecit不,我正在尽可能多地练习。周六写我的编程考试:非常感谢,它很有效!哈哈,我不知道你的最后一句话是不是在开玩笑:D我在哈斯凯尔的表现太差了..但我已经尽力了@这可不是开玩笑的。也许这并不容易,但我认为你能做到!非常感谢,它很有效!哈哈,我不知道你的最后一句话是不是在开玩笑:D我在哈斯凯尔的表现太差了..但我已经尽力了@这可不是开玩笑的。也许这并不容易,但我认为你能做到!