Haskell问题中的多项式与映射

Haskell问题中的多项式与映射,haskell,functional-programming,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 [] _ =

我需要使用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
谁能帮帮我吗


非常感谢你

你的第一次尝试是对的。只需从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]
。这意味着,它获取一个事物列表,并对每个元素应用一个函数。此函数必须只有一个参数:要操作的元素。

您的第一次尝试是正确的。只需从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]
。这意味着,它获取一个事物列表,并对每个元素应用一个函数。此函数必须只有一个参数:要操作的元素。

当您使用map时,不需要对列表是否为空进行自己的模式匹配。所以我强烈怀疑

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)对,这似乎没有多大意义。

当您使用map时,您不需要对列表是否为空进行自己的模式匹配。所以我强烈怀疑

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),这似乎没有多大意义。

它也有效!!,谢谢你的解释。我会尽量多了解一些;)@用户918139请勾选答案左侧的绿色按钮,将其标记为已接受。你也可以通过点击答案分数上方的三角形按钮来投票。它也可以!!,谢谢你的解释。我会尽量多了解一些;)@用户918139请勾选答案左侧的绿色按钮,将其标记为已接受。你也可以通过点击答案分数上方的三角形按钮进行投票。