I need to receive a list [Int] and calculate the value of the elements and return a list with the sum value. But if the sum value > 9 the list will be (example) [5,6]. But if not < 10 the list will be (example) [0,9] I have done it and doesn't work
size_list :: [Int] -> Int
size_list [] = 0
size_list (x:xs) = x size_list xs
digitVerify :: [Int] -> [Int]
digitVerify [] = []
digitVerify l = if ((size_list l) > 9)
then
(div (size_list l) 10) : (mod (size_list l) 10)
else
0 : (size_list l)
CodePudding user response:
The second parameter of the :
has to be a list even if empty []
.
Error: 0 : 3
[0,3]
: 0 : 3 : []
size_list :: [Int] -> Int
size_list [] = 0
size_list (x:xs) = x size_list xs
digitVerify :: [Int] -> [Int]
digitVerify [] = []
digitVerify l = if ((size_list l) > 9)
then
(div (size_list l) 10) : (mod (size_list l) 10) : []
else
0 : (size_list l) : []
Test:
digitVerify [3]
digitVerify [50,6]
Output:
[0,3]
[50,6]
CodePudding user response:
You're almost there.
Compiling the code in question throws the following errors, which are two instances of the same thing:
fold.hs:9:48: error:
• Couldn't match expected type ‘[Int]’ with actual type ‘Int’
• In the second argument of ‘(:)’, namely ‘(mod (size_list l) 10)’
In the expression: (div (size_list l) 10) : (mod (size_list l) 10)
In the expression:
if ((size_list l) > 9) then
(div (size_list l) 10) : (mod (size_list l) 10)
else
0 : (size_list l)
|
9 | (div (size_list l) 10) : (mod (size_list l) 10)
| ^^^^^^^^^^^^^^^^^^^^
fold.hs:11:27: error:
• Couldn't match expected type ‘[Int]’ with actual type ‘Int’
• In the second argument of ‘(:)’, namely ‘(size_list l)’
In the expression: 0 : (size_list l)
In the expression:
if ((size_list l) > 9) then
(div (size_list l) 10) : (mod (size_list l) 10)
else
0 : (size_list l)
|
11 | 0 : (size_list l)
| ^^^^^^^^^^^
Why is this?
Taking the first example, you are calling the operator :
to create your list, with two arguments: div (size_list l) 10
and mod (size_list l) 10
. (:
is actually syntax sugar for a constructor, not a function, but we can ignore this distincton in this case.)
What is the type of :
?
A GHCi session tells us:
Prelude> :type (:)
(:) :: a -> [a] -> [a]
(:)
takes a value of type a
and a list of a
s, and returns a list of a
s, which is the second argument with the first argument prepended to it.
Because you passed an Int
as the first argument, GHC expects a [Int]
as the second argument, but you've given it an Int
, hence the error.
Instead, to create a two-element list like this, you have a number of options:
Use the list literal syntax:
[div (size_list l) 10, mod (size_list l) 10]
Use the
:
operator associatively, but put the empty list at the end of the chain:div (size_list l) 10 : mod (size_list l) 10 : []
:
associates right, so this is the equivalent ofdiv (size_list l) 10 : (mod (size_list l) 10 : [])
which is valid, if you think about it.
Concatenate singleton lists:
[div (size_list l) 10] [mod (size_list l) 10]
However, since this function always returns a two-element list, it's probably more appropriate for it to return a tuple, i.e. digitVerify
should have the type [Int] -> (Int, Int)
.
I'll leave you to explore that option, if you get stuck you can just come back and ask another question.
Happy Haskelling!