我试图想出一个"单行"用于在Haskell中生成列表的排列.这是我到目前为止:
perms xs = if length xs == 0 then [[]] else [x:ys | x <- xs, ys <- perms $ delete x xs]
问题是我不得不if在Haskell中使用我不太喜欢的东西.是否可以避免使用if或多部分定义或案例陈述等,而只能使用"高阶"函数(例如foldr等)来实现这一目标?(并且理想情况下保持相对较小的单线)
如果你觉得只是摆脱if没有任何有趣的功能变化,base-4.7.0.0(与GHC 7.8捆绑在一起)包括在内bool,这是令人满意的Data.Bool.
perms xs = bool [[]] [x:ys | x <- xs, ys <- perms $ delete x xs] $ not (null xs)
Run Code Online (Sandbox Code Playgroud)