我需要使用map将多项式乘以数字。我已经尝试了很长时间,我已经疯了。我尝试了两种方法来解决这个错误:
data Pol = P [(Float,Int)] deriving Show
prodEsc :: Pol -> Float -> Pol
prodEsc (P a) n = P (prodAux a n)
--First try:
prodAux :: [(Float,Int)] -> Float -> [(Float,Int)]
prodAux [] _ = []
prodAux ((c,g):xs) n = map (\ (c,g) n -> (c*n,g)) xs
--error:
ERROR file:.\Febrero 2011.hs:21 - Type error in explicitly typed binding
*** Term : prodAux
*** Type : [(Float,Int)] -> Float -> [Float -> (Float,Int)]
*** Does not match : [(Float,Int)] -> Float -> [(Float,Int)]
--Second try:
prodAux :: [(Float,Int)] -> Float -> [(Float,Int)]
prodAux [] _ = []
prodAux (x:xs) n = map (opera x n) (x:xs)
opera :: (Float,Int) -> Float -> (Float,Int)
opera (c,g) n = (c*n,g)
--error:
ERROR file:.\Febrero 2011.hs:23 - Type error in application
*** Expression : map (opera x n) (x : xs)
*** Term : opera x n
*** Type : (Float,Int)
*** Does not match : (Float,Int) -> a
有人可以帮助我吗?。
非常感谢!!
答案 0 :(得分:3)
当您使用地图时,您无需对列表是否为空进行自己的模式匹配。所以我强烈怀疑,而不是
prodAux [] _ = []
prodAux ((c,g):xs) n = map (\ (c,g) n -> (c*n,g)) xs
你的意思是
prodAux xs n = map (\ (c,g) -> (c*n,g)) xs
否则你会扔掉第一个(c,g)对,这看似没有多大意义。
答案 1 :(得分:1)
你的第一次尝试是正确的。只需从lambda中删除n
即可。它已经在范围内,不需要:
prodAux :: [(Float,Int)] -> Float -> [(Float,Int)]
prodAux [] _ = []
prodAux ((c,g):xs) n = map (\ (c,g) -> (c*n,g)) xs
map
的类型为(a -> b) -> [a] -> [b]
。这意味着它需要一个东西列表并将函数应用于每个元素。这个函数必须只有一个参数:要操作的元素。