Haskell中的多项式与地图有关

时间:2011-08-29 17:43:54

标签: haskell functional-programming

我需要使用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

有人可以帮助我吗?。

非常感谢!!

2 个答案:

答案 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]。这意味着它需要一个东西列表并将函数应用于每个元素。这个函数必须只有一个参数:要操作的元素。