Многочлен в Хаскелле неприятности с картой - PullRequest
0 голосов
/ 29 августа 2011

Мне нужно умножить многочлен на число, используя карту. Я давно пытаюсь и уже схожу с ума. Я пробовал два способа получить эти ошибки:

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 ]

3 голосов
/ 29 августа 2011

Когда вы используете карту, вам не нужно выполнять сопоставление с собственным шаблоном, независимо от того, пуст список или нет.Поэтому я сильно подозреваю, что вместо

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 голос
/ 29 августа 2011

Ваша первая попытка верна.Просто удалите 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].это означает, что он берет список чего-либо и применяет функцию к каждому элементу.Эта функция должна иметь ровно один аргумент: элемент, над которым нужно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...