在Haskell中的列表列表中拆分内部列表

时间:2016-10-15 19:23:57

标签: list haskell list-manipulation

我目前正在努力解决在列表列表中将当前列表拆分为两个的问题。例如,如果我有:

[[A,B,C,F],[F,G,H,I]]

有没有简单的方法来分割第二个列表(因为F是头部),所以你最终得到了

[[A,B,C,F],[F],[G,H,I]]

我尝试过不同的方法,但我找不到从函数中返回两个单独值的方法。此外,由于我想分割的值在多个内部列表中重复,我只想在列表的头部而不是其他时间分割。我尝试过这样:

splitList [] = [];
splitList (F:xs) = [[F]] ++ [xs];
splitList x = [x];

然而,这显然返回了整个列表中的列表列表,导致它无法正常工作,因为我将其映射到列表中的每个元素。任何帮助都会非常感激,因为我最近才开始在Haskell工作。

1 个答案:

答案 0 :(得分:3)

函数返回一个值,但该值可以是列表或元组,例如,这样就可以返回多个值。

首先定义如何从列表的头部拆分“F”。

splitF :: String -> [String]
splitF ('F':xs) = ["F", xs]
splitF xxs      = [xxs]

splitF "ABCF" ≡ ["ABCF"]
splitF "FGHI" ≡ ["F","GHI"]

现在将此功能映射到列表中。

map splitF ["ABCF","FGHI"] ≡ [["ABCF"],["F","GHI"]]

最后连接列表。

(concat . map splitF) ["ABCF","FGHI"] ≡ ["ABCF","F","GHI"]

concatMap splitF ["ABCF","FGHI"] ≡ ["ABCF","F","GHI"]