0

このエラーが発生します

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)
4

2 に答える 2

4

k + fst $ head lは間違っていると思います。として解析される(k + fst) (head l)と思いますが、あなたが意味していると思いますk + (fst $ head l)

このため、GHC は に対して完全に間違った型をc考え出し、ひどく混乱しています。

于 2014-12-09T15:51:07.217 に答える
3

型チェッカーが予期しない型を推測する原因となる括弧のわずかな問題。まず、コードを少し再フォーマットします。

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)

(k + fst $ head l)このように、私はほとんどすぐにエラーを見つけることができましたk + fst (head l)。あなたのコードがコンパイルされたことを修正したら。

andをf使用しているため、関数が壊れる可能性があることを指摘したいと思います。headtail

adecentarPolinomio :: Polinomio -> Polinomio
adecentarPolinomio p@(Pol lista) =
    let f c@(k,n) l@((k', n'):xs) =
            if n == n'
                then ((k + k'), n) : xs
                else c : l
        f c [] = [c]
        listaOrdenada = listaPol $ ordenarPolinomio p
    in Pol (foldr f [last listaOrdenada] listaOrdenada)

fst関数は空のリストを処理するようになり、 、sndhead、および の使用を避けることができますtail

于 2014-12-09T15:51:45.883 に答える