Haskell 漂浮的麻烦
如果这个问题真的是直截了当的话,我很抱歉,但是我已经把我随机编写的一段代码弄乱了一点,我很好奇为什么下面的代码无法编译:Haskell 漂浮的麻烦,haskell,Haskell,如果这个问题真的是直截了当的话,我很抱歉,但是我已经把我随机编写的一段代码弄乱了一点,我很好奇为什么下面的代码无法编译: test::Floating a => Int -> [a] test x = map(\y -> (y * abs(cos(y)))) [0..x] 我试图理解大多数类型类,我考虑过使用浮点,因为我们使用的是余弦。该函数的目标是使用以下函数生成0到x的列表:\y->(y*abs(cos(y)) 然而,编译器抱怨x的类型(“无法将类型“a”与“Int”匹配
test::Floating a => Int -> [a]
test x = map(\y -> (y * abs(cos(y)))) [0..x]
我试图理解大多数类型类,我考虑过使用浮点,因为我们使用的是余弦。该函数的目标是使用以下函数生成0到x的列表:\y->(y*abs(cos(y))
然而,编译器抱怨x的类型(“无法将类型“a”与“Int”匹配”),称它需要类型[a],但收到[Int]。
为什么会这样?毕竟,我正在将这些整数输入我的匿名函数,以获得一个浮点列表。因为
x
是一个Int
,这意味着[0..x]
是一个Int
的列表,因此y
也是一个Int
,因为所有函数都像(*)::Num a=>a->a->a
要求两个操作数和结果的类型相同,因此这将不起作用
但是,您可以利用将一些Integral
类型转换为任意Num
类型:
test :: Floating a => Int -> [a]
test x = map(\y -> let yf = fromIntegral y in yf * abs (cos yf)) [0..x]
test::Floating a=>Int->[a]
测试x=map(\y->让yf=yf*abs中的积分y(cos-yf))[0..x]
因为x
是一个Int
,这意味着[0..x]
是一个Int
的列表,因此y
也是一个Int
,因为像(*)这样的所有函数::Num a=>a->a->a
要求两个操作数和结果为同一类型,因此这将不起作用。有道理,谢谢!