Difference between revisions of "H-99: Ninety-Nine Haskell Problems"
Jump to navigation
Jump to search
(added chessguy from #haskell's solution to problem 2) |
(Added 3 & 4 from prelude, and a trivial definition of 5) |
||
Line 32: | Line 32: | ||
myButLast :: [a] -> [a] |
myButLast :: [a] -> [a] |
||
myButLast list = drop ((length list) - 2) list |
myButLast list = drop ((length list) - 2) list |
||
+ | </haskell> |
||
+ | |||
+ | == Problem 3 == |
||
+ | |||
+ | <pre> |
||
+ | (*) Find the K'th element of a list. |
||
+ | The first element in the list is number 1. |
||
+ | Example: |
||
+ | * (element-at '(a b c d e) 3) |
||
+ | C |
||
+ | </pre> |
||
+ | |||
+ | This is (almost) the infix operator !! in Prelude, which is defined as: |
||
+ | |||
+ | <haskell> |
||
+ | (!!) :: [a] -> Int -> a |
||
+ | (x:_) !! 0 = x |
||
+ | (_:xs) !! n = xs !! (n-1) |
||
+ | </haskell> |
||
+ | |||
+ | Except this doesn't quite work, because !! is zero-indexed, and element-at should be one-indexed. So: |
||
+ | |||
+ | <haskell> |
||
+ | elementAt :: [a] -> Int -> a |
||
+ | elementAt list i = list !! (i-1) |
||
+ | </haskell> |
||
+ | |||
+ | == Problem 4 == |
||
+ | |||
+ | <pre> |
||
+ | (*) Find the number of elements of a list. |
||
+ | </pre> |
||
+ | |||
+ | This is "length" in Prelude, which is defined as: |
||
+ | |||
+ | <haskell> |
||
+ | length :: [a] -> Int |
||
+ | length [] = 0 |
||
+ | length (_:l) = 1 + length l |
||
+ | </haskell> |
||
+ | |||
+ | == Problem 5 == |
||
+ | |||
+ | <pre> |
||
+ | (*) Reverse a list. |
||
+ | </pre> |
||
+ | |||
+ | This is "reverse" in Prelude, which is defined as: |
||
+ | |||
+ | <haskell> |
||
+ | reverse :: [a] -> [a] |
||
+ | reverse = foldl (flip (:)) [] |
||
+ | </haskell> |
||
+ | |||
+ | == Problem 6 == |
||
+ | |||
+ | <pre> |
||
+ | (*) Find out whether a list is a palindrome. |
||
+ | A palindrome can be read forward or backward; e.g. (x a m a x). |
||
+ | </pre> |
||
+ | |||
+ | This is trivial, because we can use reverse: |
||
+ | |||
+ | <haskell> |
||
+ | isPalindrome :: (Eq a) => [a] -> Bool |
||
+ | isPalindrome xs = xs == (reverse xs) |
||
</haskell> |
</haskell> |
||
Revision as of 04:36, 12 December 2006
These are Haskell translations of Ninety Nine Lisp Problems.
Problem 1
(*) Find the last box of a list. Example: * (my-last '(a b c d)) (D)
This is "last" in Prelude, which is defined as:
last :: [a] -> a
last [x] = x
last (_:xs) = last xs
Problem 2
(*) Find the last but one box of a list. Example: * (my-but-last '(a b c d)) (C D)
This can be done by dropping all but the last two elements of a list:
myButLast :: [a] -> [a]
myButLast list = drop ((length list) - 2) list
Problem 3
(*) Find the K'th element of a list. The first element in the list is number 1. Example: * (element-at '(a b c d e) 3) C
This is (almost) the infix operator !! in Prelude, which is defined as:
(!!) :: [a] -> Int -> a
(x:_) !! 0 = x
(_:xs) !! n = xs !! (n-1)
Except this doesn't quite work, because !! is zero-indexed, and element-at should be one-indexed. So:
elementAt :: [a] -> Int -> a
elementAt list i = list !! (i-1)
Problem 4
(*) Find the number of elements of a list.
This is "length" in Prelude, which is defined as:
length :: [a] -> Int
length [] = 0
length (_:l) = 1 + length l
Problem 5
(*) Reverse a list.
This is "reverse" in Prelude, which is defined as:
reverse :: [a] -> [a]
reverse = foldl (flip (:)) []
Problem 6
(*) Find out whether a list is a palindrome. A palindrome can be read forward or backward; e.g. (x a m a x).
This is trivial, because we can use reverse:
isPalindrome :: (Eq a) => [a] -> Bool
isPalindrome xs = xs == (reverse xs)