diff --git a/Haskell/project-euler-solutions.cabal b/Haskell/project-euler-solutions.cabal
index 6465eaf..525ff88 100644
--- a/Haskell/project-euler-solutions.cabal
+++ b/Haskell/project-euler-solutions.cabal
@@ -18,9 +18,10 @@ executable projecteuler
   default-language:    Haskell2010
   build-depends:       base >= 4.7 && < 5
                      , containers
+                     , data-ordlist
                      , split
                      , time
-                     , data-ordlist
+                     , unordered-containers
   ghc-options:         -Wall
                        -Wcompat
                        -Widentities
@@ -47,6 +48,7 @@ executable projecteuler
     P014
     P015
     P016
+    P017
     P019
     P020
     P021
diff --git a/Haskell/src/Main.hs b/Haskell/src/Main.hs
index fa031c0..9f3f936 100644
--- a/Haskell/src/Main.hs
+++ b/Haskell/src/Main.hs
@@ -16,6 +16,7 @@ import P013
 import P014
 import P015
 import P016
+import P017
 import P019
 import P020
 import P021
@@ -55,6 +56,7 @@ main = do
     "14" : _ -> p014
     "15" : _ -> p015
     "16" : _ -> p016
+    "17" : _ -> p017
     "19" : _ -> p019
     "20" : _ -> p020
     "21" : _ -> p021
diff --git a/Haskell/src/P017.hs b/Haskell/src/P017.hs
new file mode 100644
index 0000000..c370c70
--- /dev/null
+++ b/Haskell/src/P017.hs
@@ -0,0 +1,39 @@
+-- If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total.
+--
+-- If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used?
+--
+-- NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen)
+-- contains 20 letters. The use of "and" when writing out numbers is in compliance with British usage.
+
+module P017 (p017) where
+
+import qualified Data.HashMap.Strict as M
+
+countLetters :: M.HashMap String [Int] -> Int
+countLetters ls =
+  let oneTo19 = sum (ls M.! "1to19")
+      twentyTo99 =
+        (sum . map (* 10) $ ls M.! "20to90")
+          + (sum . map (* 8) . take 9 $ ls M.! "1to19")
+      hundredTo999 =
+        (sum . map (* 100) $ ls M.! "100to900")
+          + 9 * oneTo19
+          + 9 * twentyTo99
+          - 27
+      thousand = sum (ls M.! "1000")
+   in oneTo19 + twentyTo99 + hundredTo999 + thousand
+
+p017 :: IO ()
+p017 = do
+  let letters =
+        M.fromList
+          [ ("1to19", [3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8]),
+            ("20to90", [6, 6, 5, 5, 5, 7, 6, 6]),
+            ("100to900", [13, 13, 15, 14, 14, 13, 15, 15, 14]),
+            ("1000", [11])
+          ]
+
+  putStrLn $
+    "Project Euler, Problem 16\n"
+      ++ "Answer: "
+      ++ show (countLetters letters)