2011-08-29 53 views
0

我需要乘以一個多項式使用地圖的數字。我一直在嘗試很久,我已經瘋了。我試過兩種方法得到這個錯誤:哈希克爾多項式問題與地圖

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 

任何人都可以幫我嗎?

非常感謝你!

回答

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]。這意味着,它需要一個列表並將函數應用於每個元素。這個函數必須有一個參數:要操作的元素。

+0

它的工作原理!!謝謝你的解釋。我會盡力瞭解更多信息;) – Sierra

+0

@ user918139請在答案左側的綠色按鈕上打勾,表示接受。您也可以點擊答案評分上方的三角形按鈕進行投票。 – fuz

3

當您使用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)對,這似乎並沒有太大的意義。

+0

It works !!,非常感謝你! – Sierra