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