In today’s Programming Praxis exercise, our goal is to find the first character in a string that does not occur anywhere else in the string. Let’s get started, shall we?
import Data.List import qualified Data.Map as M
To find the first non-repeated element, we mark each element as unique and insert them into a map. When a duplicate element is found, we remove its unique status. Afterwards, we search the list for the first unique element.
firstUnique :: Ord a => [a] -> Maybe a firstUnique xs = find (M.fromListWith (\_ _ -> False) (zip xs $ repeat True) M.!) xs
Some tests to see if everything is working properly:
main :: IO () main = do print $ firstUnique "aabcbcdeef" == Just 'd' print $ firstUnique "aabcbcfeed" == Just 'f' print $ firstUnique "aabcbcdeefdf" == Nothing