Чтобы ответить на ваш первый вопрос, это скорее элементный подход чем раскол. Соответствующая функция сделать это
map :: (a -> b) -> [a] -> [b]
Теперь вам нужна функция (a -> b)
где b
является [a]
, как вы хотите, чтобы преобразовать элемент в одноплодный список, содержащего один и тот же тип. Вот оно:
mkList :: a -> [a]
mkList a = [a]
так
map mkList [1,2,3,4,5,6,7] == [[1],[2],...]
Что касается вашего второго вопроса: Если вы не можете (домашнее задание?) Использовать break
, вы затем разрешается использовать takeWhile
и dropWhile
, которые образуют как половинки результата break
.
Во всяком случае, для решения без них («вручную»), просто используйте простую рекурсию с аккумулятором:
f p [] = []
f p (x:xs) = go [x] xs
where go acc [] = [acc]
go acc (y:ys) | p y = acc : go [y] ys
| otherwise = go (acc++[y]) ys
Это будет пересекать весь список хвост рекурсивно, всегда помня, что в настоящее время Подсписка есть, и когда вы достигнете элемента, где применяется p
, вывод текущего подсписок и запуск нового.
Обратите внимание, что идти первым получает [x]
вместо []
, чтобы обеспечить для случая, когда первый элемент уже удовлетворяет p x
и мы не хотим пустой первый подсписок, который будет выводиться.
Кроме того, это действует на исходный список ([1..7]
) вместо [[1],[2]...]
. Но вы можете использовать его на преобразованном один, а:
> map concat $ f (odd . head) [[1],[2],[3],[4],[5],[6],[7]]
[[1,2],[3,4],[5,6],[7]]
Почему downvotes? Потому что нет кода? – amindfv
@amindfv Я бы так догадался. Если бы ОП продемонстрировал пример того, что они пробовали, он бы продемонстрировал некоторые усилия с их стороны и облегчил бы нам помощь, потому что мы знали бы, какая помощь нужна ОП. Я не голосовал, но если бы у меня был, я бы, вероятно, отказался и добавил комментарий вроде «Что ты пробовал?» – mhwombat