Convert roman to arabic
Since the Roman numerals are fixed and known in advance, it would be more efficient to write:

translateRomanDigit :: Char -&gt; Int
translateRomanDigit 'I' = 1
translateRomanDigit 'V' = 5
...

translateFromRoman = map translateRomanDigit


The compiler can implement translateRomanDigit as a jump table or as a binary search. Using lookup will always perform a linear search.

As for &gt;&gt;&gt; vs . - there should be no difference except that &gt;&gt;&gt; requires you to import Control.Arrow whereas . is provided for in the Prelude.