在另一个问题(How to write a simple list-based quicksort in Idris?)中,我只是想了解为什么Prelude.Applicative.guard
需要Ord
类型类。
Guard定义为like this:
guard : Alternative f => Bool -> f ()
guard a = if a then pure () else empty
查看Alternative
界面docs(我实际上并不了解它在代码中是如何定义的,但我在学习Idris时并不是很远),我不知道看看它如何需要Ord
。
答案 0 :(得分:2)
guard
不需要Ord
约束,而是前一个问题中的(<)
。我在List (Ord b)
和Ord b => List b
之间给出了distingush的答案。
要查看guard
抱怨缺少约束的原因,请参阅monad comprehensions如何去糖。
[y | y <- xs, y < x]
变为do {y <- xs; guard (y < x); pure y}
。