回3L 这代码不可能是你底下运行结果。 底下应该return (x, y) 之所以生成所有排列: list monad的return是 return x = [x] 而list monad的bind操作,也就是>=,也被称为flatmap,平坦map的结果。 flatmap f xs = concat (map f xs) 举例子 假设f x = [x+10, x * 10]则 flatmap f [a, b, c] = concat [[ a + 10, a * 10], 略过,略过] = [ a + 10, a * 10, b + 10, b * 10, c + 10, c * 10] 你的代码是两层flatmap,自己算算答案对不对