guard
не нуждается в ограничении Ord
, а (<)
в вашем предыдущем вопросе.Я дал там ответ на distingush между List (Ord b)
и Ord b => List b
.
Чтобы понять, почему guard
жалуется на отсутствующее ограничение, посмотрите, как понимание монады обессахаривается.
[y | y <- xs, y < x]
становится do {y <- xs; guard (y < x); pure y}
.