data NumberOrString = Number Int | String String

cmp :: (Ord a) => (a -> a -> Bool) -> NumberOrString -> NumberOrString -> Maybe Bool
cmp op (Number n) (Number m) = Just $ op n m
cmp op (String s) (String t) = Just $ op s t
cmp _ _ _ = Nothing

こんな関数を作ろうと思ったんですが
Couldn't match the rigid variable `a' against `Int' ...
と出てきてコンパイルできません。このような関数を定義するにはどうしたらいいんでしょうか?