Объединить отсортированные исходные данные в Haskell?

Попробуйте вызвать layoutIfNeeded для суперпредставления представления вместо самого представления.

-

У меня была похожая проблема, мой взгляд должен был анимироваться сверху на высоте 0, вниз до высоты> 0 (т.е. (0, 0, 320, 0) до ( 0, 0, 320, 44)).

При использовании Xcode 8 с iOS 10 поведение анимации сильно отличалось. Вместо анимации сверху вниз, анимация вверх и вниз от вертикального центра кадра назначения.

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

Надеюсь, это поможет!


Полезный комментарий @Ramiro:

Согласно документации, layoutIfNeeded выкладывает подпредставления (но не рассматривает текущий вид сам). Таким образом, чтобы обновить текущее представление, вам нужно вызвать layoutIfNeeded из суперпредставления.

8
задан 2 June 2009 в 20:22
поделиться

4 ответа

, если эффективность не была проблемой, я бы выбрал

merge = sort . concat

, в противном случае:

merge :: Ord a => [[a]] -> [a]
merge [] = []
merge lists =
  minVal : merge nextLists
  where
    heads = map head lists
    (minVal, minIdx) = minimum $ zip heads [0..]
    (pre, ((_:nextOfMin):post)) = splitAt minIdx lists
    nextLists =
      if null nextOfMin
      then pre ++ post
      else pre ++ nextOfMin : post

обратите внимание, однако, что эта реализация всегда линейно ищет минимум (в то время как для большого количества списка один может пожелать сохранить кучу и т. д.)

1
ответ дан 5 December 2019 в 13:01
поделиться

Примерно так должно работать:

merge2 pred xs [] = xs
merge2 pred [] ys = ys
merge2 pred (x:xs) (y:ys) =
  case pred x y of
      True  -> x: merge2 pred xs (y:ys)
      False -> y: merge2 pred (x:xs) ys

merge pred [] = []
merge pred (x:[]) = x
merge pred (x:xs) = merge2 pred x (merge pred xs)

Здесь функция merge2 объединяет 2 списка. Функция merge объединяет список списков. Предикат - это предикат, который вы используете для сортировки.

Пример:

merge (<) [[1, 3, 9], [2, 3, 4], [7, 11, 15, 22]]

должен возвращать

[1,2,3,3,4,7,9,11,15,22]
8
ответ дан 5 December 2019 в 13:01
поделиться

Основные проблемы с использованием ядра Linux для замены микроконтроллерных систем связаны с управлением устройствами, с которыми вы взаимодействуете. Для этого вам, возможно, придется написать драйверы. Я бы сказал придерживайтесь C в качестве языка, потому что вы хотите, чтобы пользовательское пространство было как можно более чистым. Более компактную стандартную библиотеку можно найти в библиотеке uclibc .

http://www.uclibc.org/

Вы также можете найти busybox полезным. Это предоставляет множество утилит пользовательского пространства в виде единого двоичного файла.

http://www.busybox.net/

Тогда это просто вопрос загрузки из некоторого хранилища в работающую систему и запуска некоторой управляющей логики через init, который взаимодействует с с вашим оборудованием. При необходимости вы можете получить доступ к действующей системе и запустить утилиты busybox. В самом деле, единственное отличие состоит в том, что пространство пользователя намного меньше, чем в обычном дистрибутиве, и вы будете работать «ближе» к ядру с точки зрения целей.

Также обратите внимание на Linux реального времени.

http: //www.realtimelinuxfoundation .org /

Если вам нужно формальное обещание завершения задачи. Я подозреваю, что самым сложным будет загрузка / постоянное хранилище и взаимодействие с вашим оборудованием, если оно экзотическое. Если вы не знакомы с загрузкой Linux, тогда

http://www.cromwell-intl.com/unix/linux-boot.html

Может помочь.

Короче говоря, если вы еще не разработали глубоко для Linux, если вы создали свой собственный дистрибутив или имеете опыт работы с ядром, тогда вы можете найти программирование трудным .

http: //www.linuxdevices.

2
ответ дан 5 December 2019 в 13:01
поделиться

В отличие от других постов, я бы имел бы слияние :: [A] -> [A] -> [A]

type SortedList a = [a]

merge :: (Ord a) => SortedList a -> SortedList a -> SortedList a
merge []     ys     = ys
merge xs     []     = xs
merge (x:xs) (y:ys)
  | x < y     = x : merge xs (y : ys)
  | otherwise = y : merge (x : xs) ys

mergeAll :: (Ord a) => [SortedList a] -> SortedList a
mergeAll = foldr merge []
1
ответ дан 5 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: