Я не думаю, что существуют любые твердые правила; с помощью уровней log4j-типа мои 'эмпирические правила' - что-то как:
Не набор в камне, но общее представление о том, как я думаю о нем.
Я не могу скомпилировать ваш код, поэтому ... слепой выстрел:
попробуйте
forallAtoms :: (forall a. (Atomic a, Show a) => a -> Bool) -> [TestOptions -> IO TestResult]
в качестве сигнатуры типа. Для этого требуется расширение языка -XRankNTypes.
Проблема, с которой вы столкнулись, как я понимаю, заключается в том, что GHC пытается найти один тип, который нужно вставить для a
в x :: (a -> Bool)
для всей области действия функции, но вы уже указали там три разных.