浮动问题

如果这个问题真的很简单,我很抱歉,但我一直在用我制作的一段随机代码搞砸了,我很好奇为什么下面的代码不能编译:

test::Floating a => Int -> [a]
test x = map(y -> (y * abs(cos(y)))) [0..x]

我试图理解大多数类型类,并且我想到了使用 Floating,因为我们使用的是余弦。该函数的目标是使用以下函数制作 0 到 x 的列表:y -> (y * abs(cos(y)))

然而,编译器抱怨 x 的类型(“无法将类型 'a' 与 'Int' 匹配”),说它需要一个类型 [a] 但收到 [Int]。为什么是这样?毕竟我将这些整数提供给我的匿名函数以获取浮点数列表。

回答

因为x是 an Int,这意味着[0..x]是一个Ints列表,因此y也是一个Int,因为所有函数(*) :: Num a => a -> a -> a都需要两个操作数和结果是相同的类型,因此这将不起作用。

但是,您可以使用fromIntegral :: (Integral a, Num b) => a -> b将多个Integral类型转换为任何Num类型:

test :: Floating a => Int -> [a]
test x = map(y -> let yf = fromIntegral y in yf * abs (cos yf)) [0..x]


以上是浮动问题的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>