このエラーが発生します
Polinomios.hs:117:125:
Occurs check: cannot construct the infinite type:
t0 = (t0, t1) -> t0
Expected type: (t0, t1)
Actual type: ((t0, t1) -> t0, t1)
In the first argument of `(:)', namely `c'
In the expression: c : l
In the expression:
if n == (snd $ head $ l) then
((k + fst $ head l), n) : (tail l)
else
c : l
私はすでにそれをグーグルで検索しましたが、タイプエラーが関係していると思われますが、99%はそうではないと確信しています。これは以前に質問されたことは知っていますが、これを解決できません
adecentarPolinomio :: Polinomio -> Polinomio
adecentarPolinomio p@(Pol lista) = let f = \c@(k,n) l -> if n == (snd $ head $ l) then ((k + fst $ head l),n):(tail l) else c:l
listaOrdenada = listaPol $ ordenarPolinomio p
in Pol (foldr f [last listaOrdenada] listaOrdenada)
使用したコード:
data Coeficiente = C Int Int
data Polinomio = Pol [(Coeficiente,Grado)]
type Grado = Int
listaPol :: Polinomio -> [(Coeficiente, Int)]
listaPol (Pol l) = l
ordenarPolinomio :: Polinomio -> Polinomio
ordenarPolinomio (Pol lista) = Pol (sortBy (compare `on` snd) lista)
instance Num Coeficiente where
(+) (C 0 a) (C 0 b) = C 0 (a+b)
(+) (C n a) (C m b) = C n (mod (a+b) n)
(*) (C 0 a) (C 0 b) = C 0 (a*b)
(*) (C n a) (C m b) = C n (mod (a*b) n)
negate (C 0 a) = C 0 (-a)
negate (C n a) = C n (mod (-a) n)