sublists [] = [[]]
sublists (x:xs) = [x:sublist | sublist <- sublists xs]
++ sublists xs
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,有人可以解释一下[x:sublist | sublist <- sublists xs]这行的确切发生以及<-这种类型的构造函数到底是做什么的吗?
这里没有类型构造函数.此语法称为列表推导.它基于数学的集合理解.列表推导给出了一个表达式来创建列表的元素.在这种特殊情况下,元素是使用表达式创建的x:sublist.sublist <- sublists xs表示sublist获取生成的列表中每个元素的值sublists xs.
如果您想在特定示例中查看其工作原理,可以使用替换原则.第一步看起来像这样:
sublists [1, 2, 3]
= [1:sublist | sublist <- sublists [2, 3]] ++ sublists [2, 3]
Run Code Online (Sandbox Code Playgroud)
现在您需要sublists [2, 3]使用相同的想法进行评估.我会将此作为练习留给读者.(请注意,Haskell实际上会对此表达式进行两次评估.但是,手动执行此操作只是繁忙的工作而且完全浪费时间.一次评估它就足以了解这里发生的事情.)