-- Problem 1 -- (*) Find the last element of a list. -- (Note that the Lisp transcription of this problem is incorrect.) -- Example in Haskell: -- Prelude> myLast [1,2,3,4] -- 4 -- Prelude> myLast ['x','y','z'] -- 'z' module Main where main::IO() main = putStrLn "Hello World" myLast :: [a]->a myLast [] = error "error" myLast [x] = x myLast (_:xs) = myLast xs myLast' :: [a] -> a myLast' = head.reverse myLast'' :: [a] -> a myLast'' xs = xs!! (length xs -1) -- 2 Problem 2 -- (*) Find the last but one element of a list. -- (Note that the Lisp transcription of this problem is incorrect.) -- Example in Haskell: -- Prelude> myButLast [1,2,3,4] -- 3 -- Prelude> myButLast ['a'..'z'] -- 'y' myButLast::[a] -> a myButLast [] = error "error" myButLast [x] = error "error" myButLast (x:xs) = if length xs == 1 then x else myButLast xs myButLast' :: [a]->a myButLast' = last.init myButLast'' ::[a]->a myButLast'' [x,_] = x myButLast'' (_:xs) = myButLast'' xs -- 3 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 -- Example in Haskell: -- Prelude> elementAt [1,2,3] 2 -- 2 -- Prelude> elementAt "haskell" 5 -- 'e' elementAt :: [a]->Int->a elementAt (x:_) 1 = x elementAt (_:xs) n = elementAt xs (n-1) elementAt _ _ = error "error" elementAt' :: [a]->Int->a elementAt' (x:_) 1 = x elementAt' [] _ = error "error" elementAt' (_:xs) n = if n<1 then error "error" else elementAt' xs (n-1) -- 4 Problem 4 -- (*) Find the number of elements of a list. -- Example in Haskell: -- Prelude> myLength [123, 456, 789] -- 3 -- Prelude> myLength "Hello, world!" -- 13 myLength :: [a]->Int myLength [] = 0 myLength (_:xs) = 1+myLength xs myLength' :: [a] -> Int myLength' = sum . map (\_->1) -- 5 Problem 5 -- (*) Reverse a list. -- Example in Haskell: -- Prelude> myReverse "A man, a plan, a canal, panama!" -- "!amanap ,lanac a ,nalp a ,nam A" -- Prelude> myReverse [1,2,3,4] -- [4,3,2,1] myReverse :: [a]->[a] myReverse [] = [] myReverse (x:xs) = myReverse xs ++ [x]