获取嵌套列表的头部和尾部

时间:2016-04-17 23:08:26

标签: haskell functional-programming nested-lists

我有一个如此声明的嵌套列表类型:

data NestedList a 
= Int a
| List [NestedList a]
deriving (Show, Eq)

我试图获取NestedList的头部和尾部,但我不确定它是如何实现的。我的尝试并没有真正成功,因为它将获得NestedList中的第一个Int。我的代码是:

headList :: NestedList a -> NestedList a
headList (Int x) = Int x
headList (List x) = head $ map headList x

我理解为什么这不起作用,因为它迭代所有列表并从每个列表中获取Int。例如:

test = List [List [Int 5]] -> headList test = Int 5, instead of List [Int 5]

我想尾部的解决方案是相似的(除了列表而不是元素部分),所以任何人都可以帮助我让headList至少工作吗?

1 个答案:

答案 0 :(得分:2)

NestedList a aInt的原子,标有A(让我们使用a代替)或嵌套N的列表(让我们使用data NestedList a = A a | N [NestedList a] deriving (Show, Eq) ):

N[ ]

那么,什么是空名单? - 它的A x。它没有头部或尾部。

单身人士名单是什么? - 如果它是N[A x]x,则其标题只是N(h:t)

单身人士名单的尾巴是什么? - 这是一个空列表。

什么是较长列表的尾部h? - 如果A _N t,则为head

您有更多嵌套结构的其他情况涉及更多。在这种情况下,您希望tail返回最左侧的原子吗?headNested (A x) = x headNested (N xs) = headNested (head xs) 构造一个类似嵌套的结构,而不包含最左边的元素?这可以递归地完成:

N[ N[ ], N[ ]]

右?不是那么简单,正如user Bergi在评论中指出的那样:嵌套的空列表案例normalize怎么样?它也被认为是空的吗? (可能是)。所以这必须更多参与。也许您想要决定某种规范结构,并实现Maybe例程,以便首先使用。

或者更好的是,保持结构不变,而是按照the other advice in the comments,切换到返回$(".pagination li a").click(function(){ $("#modalContent").load($(this).attr('href')); return false; }); 对头部和尾部,然后递归使用