Convert Roman Numeral to Arabic
Parens

When you call a function you do not need to place the argument in parens:

Instead of:  readNumerals(line)
       Use:  readNumerals line


Error Handling

In Haskell we use types like Either or Maybe to indicate errors. Instead of:

let nums = readNumerals(line)
if errorNum `elem` mums
  then ...some error...
  else ...


You should define readNumerals to have this type:

readNumerals :: String -&gt; Maybe [Numeral]


and write:

case readNumerals line of
  Nothing -&gt; ... some error ...
  Just ns -&gt; ... parse was valid, numerals are in `ns` ...


data Numeral

The data structure Numeral has many fields which are redundant. For instance, if n is a Numeral and numeralValue n is 1, then it will always be the case that numeralSymbol n will be I and subRules n will be ['V','X']. So there's no point storing these in the record - you can just implement these as functions:

subRules :: Numeral -&gt; [Char]
subRules n = case numeralValue n of
                1  -&gt; ['V','X']
                5  -&gt; []
                10 -&gt; ['L', 'C']
                ...


This allows you to eliminate the subRules field from the record.

Make Numeral an ADT

In fact, Numeral doesn't even need any fields. Here's a simpler way to implement Numeral:

data Numeral = I | V | X | L | C deriving (Show, Eq)

numeralValue :: Numeral -&gt; Int
numeralValue I = 1
numeralValue V = 5
...

subRule :: Numeral -&gt; [Numeral]
subRule I = [V, X]
subRule V = []
...


The nice thing is that the code for getValue doesn't change at all. The function subRuler does change a little (and also becomes simpler):

subRuler :: [Numeral] -&gt; [Numeral] -&gt; Bool
subRuler [] _ = False
subRuler _ [] = False
subRules as bs = (head bs) `elem` as


Avoid using head

head is a partial function - i.e. it could throw an error. Here's how to write subRuler without using head:

subRules [] _ = False
subRuler _ [] = False
subRuler as (b:_) = b `elem` as


We've replaced head with pattern matching, and it does the same thing. tail is also a partial function which you should replace with pattern matching.