为什么1:[[]]等于(1:[]):[]?

use*_*306 1 haskell list-comprehension

正如标题所说,我并没有完全理解哈斯克尔如何解释

1:[[]]
Run Code Online (Sandbox Code Playgroud)

它为什么这么做(1:[]):[]

E:我从以下方面得到了这个想法:

part'::[a] -> [[a]]
part' [] = [[]]
part' (x:xs) = p ++ [x:ys | ys <- p]
    where p = part' xs
Run Code Online (Sandbox Code Playgroud)

具体来自 p ++ [x:ys | ys <- p]

例如part'[1]:我的思路是否正确?:

part'[1] = (part'[]) ++ [1:ys | ys <- part'[]]
--> = [[]] ++ [1:[[]]]
Run Code Online (Sandbox Code Playgroud)

希望这说清楚.

Isa*_*aac 8

好像你误解了[... | ys <- p]语法.在这种情况下,ys是列表中每个元素的替代p,而不是整个列表.你问题的最后部分的等式推理应该是

part' [1] = (part' []) ++ [1:ys | ys <- p]
-- = [[]] ++ [1:ys | ys <- [[]]]
-- = [[]] ++ [1 : []]
-- = [[], [1]]
Run Code Online (Sandbox Code Playgroud)

  • @ user452306没有占位符.空列表是一个空的列表,它没有元素.将类似*1*的元素("consing")预先添加到空列表中意味着创建其中包含*1*的新列表,然后是前一列表中的所有元素 - 在这种情况下是*不再是元素*.总而言之,新列表包含*1*作为其唯一元素.或者在Haskell中:1:[] = [1]`.这是从`(:)`运算符的类型:`(:) :: a - > [a] - > [a]`.即它需要一个元素和一个类似元素的列表,并创建一个类似元素的组合列表. (3认同)