我有一个如此声明的嵌套列表类型:
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
至少工作吗?
答案 0 :(得分:2)
NestedList
a
a
是Int
的原子,标有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;
});
对头部和尾部,然后递归使用 。