Как внедрить вставку с помощью складчатости в haskell. Я попытался:Реализация вставки в haskell с foldr
insert'' :: Ord a => a -> [a] -> [a]
insert'' e xs = foldr (\x -> \y -> if x<y then x:y else y:x) [e] xs
Нет кости. Мне нужно вставить элемент e в список, чтобы он доходил до первого элемента, который больше или равен ему.
Пример:
insert'' 2.5 [1,2,3] => [1.0,2.0,2.5,3.0]
insert'' 2.5 [3,2,1] => [2.5,3.0,2.0,1.0]
insert'' 2 [1,2,1] => [1,2,2,1]
В последнем примере первый 2 вставляется один.
EDIT: Thanks @Lee.
У меня это сейчас:
insert'' :: Ord a => a -> [a] -> [a]
insert'' e xs = insert2 e (reverse xs)
insert2 e = reverse . snd . foldr (\i (done, l) -> if (done == False) && (vj e i) then (True, e:i:l) else (done, i:l)) (False, [])
where vj e i = e<=i
Но это не работает:
insert'' 2 [1,3,2,3,3] => [1,3,2,2,3,3]
insert'' 2 [1,3,3,4] => [1,3,2,3,4]
insert'' 2 [4,3,2,1] => [4,2,3,2,1]
РЕШЕНИЕ:
insert'' :: Ord a => a -> [a] -> [a]
insert'' x xs = foldr pom poc xs False
where
pom y f je
| je || x > y = y : f je
| otherwise = x : y : f True
poc True = []
poc _ = [x]
Благодаря @Pedro Rodrigues (Это просто nedded изменить х > = y до x> y.)
(Как отметить это как ответ?)
складки обычно используются для сокращения списков, а не для их расширения. Кроме того, ваше описание и ваш третий пример противоречат друг другу. По вашему описанию он должен быть вставлен перед 3, как в первом примере. – bheklilr
Извините, я его отредактировал. – excrucio
@bheklilr: Каков наилучший способ решить это? Является ли явная рекурсия или любая функция высшего порядка для решения этого? – Sibi