English 中文(简体)
Haskell -- more type inference problems
原标题:

I have the following expression:

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

and i get the following error:

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:UsersRCIXDesktopHaskell Code	est.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)))

yet when i do a :t [0,0,0,0,0,0,0,0,0,0] i get back [0,0,0,0,0,0,0,0,0,0] :: (Num t) => [t]. So why can t i use it in the first expression?

最佳回答

You re using digitToInt, which returns an Int, not the input type.

问题回答

Chuck is right. To avoid cluttering your code you can use the . operator to add the needed function:

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

This is presuming that singleDigitCount and processOneCount also work on arbitrary numeric types.





相关问题
Euler Problem in Haskell -- Can Someone Spot My Error

I m trying my hand at Euler Problem 4 in Haskell. It asks for that largest palindrome formed by multiplying two three-digit numbers. The problem was simple enough, and I thought my Haskell-fu was up ...

How does foldr work?

Can anybody explain how does foldr work? Take these examples: Prelude> foldr (-) 54 [10, 11] 53 Prelude> foldr (x y -> (x+y)/2) 54 [12, 4, 10, 6] 12.0 I am confused about these executions....

Efficient queue in Haskell

How can I efficiently implement a list data structure where I can have 2 views to the head and end of the list, that always point to a head a tail of a list without expensive calls to reverse. i.e: ...

Problem detecting cyclic numbers in Haskell

I am doing problem 61 at project Euler and came up with the following code (to test the case they give): p3 n = n*(n+1) `div` 2 p4 n = n*n p5 n = n*(3*n -1) `div` 2 p6 n = n*(2*n -1) p7 n = n*(5*n -3)...

Ways to get the middle of a list in Haskell?

I ve just started learning about Functional Programming, using Haskel. I m slowly getting through Erik Meijer s lectures on Channel 9 (I ve watched the first 4 so far) and in the 4th video Erik ...

haskell grouping problem

group :: Ord a => [(a, [b])] -> [(a, [b])] I want to look up all pairs that have the same fst, and merge them, by appending all the list of bs together where they have the same a and discarding ...

Closest equivalent to subprocess.communicate in Haskell

I want to do a popen() / python s subprocess.communicate from Haskell - start a program, give it stdin, and get its stdout/stderr. What s the most direct / Haskellish way to do this?

热门标签