This post originated from an RSS feed registered with Java Buzz
by Elliotte Rusty Harold.
|
Original Post: words with fold
Feed Title: Mokka mit Schlag
Feed URL: http://www.elharo.com/blog/feed/atom/?
Feed Description: Ranting and Raving
|
Latest Java Buzz Posts
Latest Java Buzz Posts by Elliotte Rusty Harold
Latest Posts From Mokka mit Schlag
|
|
Advertisement
|
Real World Haskell, Exercise 10, p. 98: Write the words
function using list folds:
myWords :: String -> [String]
myWords s = reverse (foldr step [] (trim s))
step :: Char -> [String] -> [String]
step c [] = [c:[]]
step c acc
| (isSpace c) = acc ++ [""]
| otherwise = (take ((length acc) - 1) acc) ++ [c:(last acc)]
isSpace :: Char -> Bool
isSpace ' ' = True
isSpace '\n' = True
isSpace '\r' = True
isSpace '\t' = True
isSpace _ = False
lstrip :: String -> String
lstrip [] = ""
lstrip (x:xs)
| (isSpace x) = lstrip xs
| otherwise = x:xs
rstrip :: String -> String
rstrip s = reverse (lstrip (reverse s))
trim :: String -> String
trim = lstrip . rstrip
Moral of this exercise: you can only pass a list to ++
. You can’t use ++
to append a Char to a String. You have to append [c]
instead.
There’s probably an isSpace
function in the standard library somewhere I could be using instead. (Found it. It’s Char.isSpace
)
The trim
function feels unnecessary. A more clever implementation of the fold might avoid it.
And that reverse
is really yucky. I should be able to rewrite the fold so the values come out in the right order.
Read: words with fold