答案 0 :(得分:20)
嗯,首先ListT
不是真正的monad变换器。它违反了某些潜在的单子的相关性定律。它也很慢,一般来说列表的monadic接口也是如此。它建立在内部的实际列表中。
LogicT
可能是列表式monad变换器的最佳选择。它不仅实现了一个合适的monad变换器,而且还为 fair 列表产品提供了一些非常有用的组合器。
ChoiceT
是我自己的作品。它基本上只是LogicT
的CPSed版本,受{em} monadLib 的LogicT
和ChoiceT
启发。它非常快,通常表现优异(非变换)列表,但类型可能很吓人,你可能会受到结果类型的限制,这有时可能会以你的方式出现。
结论:如果您是认真的,请使用LogicT
。