1 votes

Haskell -- plus de problèmes d'inférence de type

J'ai l'expression suivante :

getCount :: (Num a) => a -> [a]
getCount int = foldl 
       processOneCount 
       [0,0,0,0,0,0,0,0,0,0] 
       (map (singleDigitCount) (map (digitToInt) (show int)))

et j'obtiens l'erreur suivante :

Couldn't match expected type `a' against inferred type `Int'
  `a' is a rigid type variable bound by
      the type signature for `getCount'
        at C:\Users\RCIX\Desktop\Haskell Code\test.hs:23:17
  Expected type: [a]
  Inferred type: [Int]
In the expression:
    foldl
      processOneCount
      [0, 0, 0, 0, ....]
      (map (singleDigitCount) (map (digitToInt) (show int)))
In the definition of `getCount':
    getCount int
               = foldl
                   processOneCount
                   [0, 0, 0, ....]
                   (map (singleDigitCount) (map (digitToInt) (show int)))

Pourtant, lorsque je fais une :t [0,0,0,0,0,0,0,0,0,0] je reviens [0,0,0,0,0,0,0,0,0,0] :: (Num t) => [t] . Alors pourquoi je ne peux pas l'utiliser dans la première expression ?

4voto

Chuck Points 138930

Vous utilisez digitToInt qui renvoie un Int, et non le type d'entrée.

0voto

Dan Points 6451

Chuck a raison. Pour éviter d'encombrer votre code, vous pouvez utiliser la fonction . pour ajouter la fonction nécessaire :

  (map (singleDigitCount) (map (fromIntegral . digitToInt) (show int)))

Cela suppose que singleDigitCount y processOneCount fonctionnent également sur des types numériques arbitraires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X