Compare commits

..

2 Commits

Author SHA1 Message Date
c54a056489 Adding more info to the README 2023-11-16 14:13:16 +07:00
a226b35406 Some more Haskell exercises. Adding LICENSE 2023-11-16 14:10:26 +07:00
2 changed files with 68 additions and 8 deletions

View File

@ -80,11 +80,71 @@ myLength xs = foldl (\acc _ -> acc + 1) 0 xs
myLength' [] = 0
myLength' [x] = 1
myLength' (_:xs) = 1 + myLength xs
myLength [1..5]
myLength' [1..5]
#+end_src
#+RESULTS:
: 5
*** #5 Reverse a list.
#+begin_src haskell
λ> myReverse "A man, a plan, a canal, panama!"
"!amanap ,lanac a ,nalp a ,nam A"
λ> myReverse [1,2,3,4]
[4,3,2,1]
#+end_src
**** Solution
#+begin_src haskell
myReverse = go []
where go acc [] = acc
go acc (x:xs) = go (x:acc) xs
#+end_src
*** #6 Find out whether a list is a palindrome
#+begin_src haskell
λ> isPalindrome [1,2,3]
False
λ> isPalindrome "madamimadam"
True
λ> isPalindrome [1,2,4,8,16,8,4,2,1]
True
#+end_src
**** Solution
#+begin_src haskell
isPalindrome xs = xs == reverse xs
#+end_src
*** #7 Flatten a nested list structure.
Transform a list, possibly holding lists as elements into a `flat' list by replacing each list with its elements (recursively).
Example:
#+begin_src haskell
,* (my-flatten '(a (b (c d) e)))
(A B C D E)
#+end_src
Example in Haskell:
We have to define a new data type, because lists in Haskell are homogeneous.
#+begin_src haskell
data NestedList a = Elem a | List [NestedList a]
#+end_src
#+begin_src haskell
λ> flatten (Elem 5)
[5]
λ> flatten (List [Elem 1, List [Elem 2, List [Elem 3, Elem 4], Elem 5]])
[1,2,3,4,5]
λ> flatten (List [])
[]
#+end_src
**** Solution
#+begin_src haskell
flatten = reverse . go []
where go acc (List []) = acc
go acc (Elem x) = x:acc
go acc (List (x:xs)) = go (go acc x) (List xs)
#+end_src

View File

@ -12,7 +12,7 @@ source code block.
* Progress
- [16/99] OCaml
- [4/99] Haskell
- [7/99] Haskell
- [0/99] Lisp (Soon)
* References