Folding a lcm of a list


#1

Hi everyone, I’m trying to define the lcm of a list of numbers. This is what I did:

lcmm :: (Integral a) => a -> Int
lcmm []=0
lcmm [x]=x
lcmm [a,b] = lcm a b
lcm (x:xs = lcmm (x) (lcmm xs)

I don’t know why this is not working :frowning:


#2

A missing parenthesis, missing character and one character too many:

lcmm (x:xs) = lcm (x) (lcmm xs)

But that is not all. The type of your function lcmm :: (Integral a) => a -> Int seems to indicate that it takes an argument of type Integral a => a. But in the definition you use list patterns. You can’t know that your input is going to be a list if you use the general type Integral a => a -> Int (in fact lists are not members of the Integral class), so you can’t use things like [], [x] or (x:xs) in the pattern match.

A way to solve this would be to change the type of your function:

lcmm :: [Int] -> Int

On the mathematical side, I would define lcmm [] = 1. Because the identity of multiplication is 1. That allows you to write the function as a nice fold: lcmm = foldr lcm 1.

If you really want to take a list of elements of type Integral a => a as input I would recommend writing it like this:

lcmm :: Integral a => [a] -> a
lcmm [] = 1
lcmm (x:xs) = lcm x (lcmm xs)