#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"]