I’m in the process of familiarizing myself with Haskell (wouldn’t say it’s learning at this point), so decided to work on some Project Euler problems. Here are my solutions to problems 1-5. One thing to notice – they are unusually long for a Haskell program and as usual – take them with a grain of salt.

## Project Euler 1 in Haskell

Project Euler problem 1

```mul35 :: Int -> Int
mul35 n = sum xs
where
xs = [i | i <- [1..n-1],
(i `mod` 3 == 0) ||
(i `mod` 5 == 0)]

main =
do
print \$ mul35 10
print \$ mul35 1000
```

## Project Euler 2 in Haskell

Project Euler problem 2

```fibs :: [Int]
fibs = 1 : 2 : [a + b | (a, b) <- zip fibs (tail fibs)]

sumFibs :: Int -> Int
sumFibs ms = sum [x | x <- takeWhile (< ms) fibs, even x]

main = do
print \$ sumFibs 4000000
```

## Project Euler 3 in Haskell

Project Euler problem 3

```lpf :: Int -> Int
lpf n = if md == n then n
else lpf (n `div` md)
where md = head [x | x <- [2..n], n `mod` x == 0]

main = do
print \$ lpf 13195
print \$ lpf 600851475143
```

## Project Euler 4 in Haskell

Project Euler problem 4

```import Data.List (tails)

numsLen :: Int -> [Int]
numsLen l = [mx,mx-1..mi] where
mi = 10^(l-1)
mx = 10^l - 1

digits :: Int -> [Int]
digits 0 = []
digits n = n `mod` 10 : digits (n `div` 10)

palindrome :: Int -> Bool
palindrome n = digits n == reverse (digits n)

lpal :: Int -> Int
lpal d = maximum ps where
ns = numsLen d
xss = tails ns
ps = [y | x:xs <- xss, y <- map (* x) xs, palindrome y]

main = do
print \$ lpal 2
print \$ lpal 3
```

## Project Euler 5 in Haskell

Project Euler problem 5

```lcmm :: [Int] -> Int
lcmm [] = error "Empty list"
lcmm [x] = x
lcmm xs = foldr1 lcm xs

hdbf :: Int -> Int
hdbf n = lcmm [1..n]

main = do
print \$ hdbf 10
print \$ hdbf 20
print \$ hdbf 30
```