Разделение внутренних списков внутри списка списков в Haskell

#list #haskell #list-manipulation

#Список #haskell #управление списком

Вопрос:

В настоящее время я борюсь с проблемой разделения текущего списка на два в списке списков. Например, если у меня есть:

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

Есть ли какой-нибудь простой способ разделить второй список (потому что F — это head), чтобы в итоге вы получили

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

Я пытался сделать это по-разному, но я не могу найти способ вернуть два отдельных значения из функции. Кроме того, поскольку значение, которое я хотел бы разделить, повторяется в нескольких внутренних списках, я хочу разделить только тогда, когда оно является главой списка, и ни в какое другое время. Я попытался сделать это так:

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

Однако это, очевидно, вернуло список списков в общем списке, в результате чего он, в свою очередь, не работал, поскольку я сопоставил его с каждым элементом в списке. Любая помощь была бы очень признательна, поскольку я только недавно начал работать в Haskell.

Комментарии:

1. Это похоже на проблему XY: meta.stackexchange.com/a/66378

Ответ №1:

Функции возвращают одно значение, но это значение может быть, например, списком или кортежем, и таким образом вы можете возвращать несколько значений.

Сначала определите, как разделить букву «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"]