Попробуйте вызвать layoutIfNeeded
для суперпредставления представления вместо самого представления.
-
У меня была похожая проблема, мой взгляд должен был анимироваться сверху на высоте 0, вниз до высоты> 0 (т.е. (0, 0, 320, 0) до ( 0, 0, 320, 44)).
При использовании Xcode 8 с iOS 10 поведение анимации сильно отличалось. Вместо анимации сверху вниз, анимация вверх и вниз от вертикального центра кадра назначения.
Я исправил это, вместо того, чтобы вызывать layoutIfNeeded
для самого представления, вызывая его для суперпредставления представления. Каким-то образом поведение было восстановлено.
Надеюсь, это поможет!
Согласно документации,
layoutIfNeeded
выкладывает подпредставления (но не рассматривает текущий вид сам). Таким образом, чтобы обновить текущее представление, вам нужно вызватьlayoutIfNeeded
из суперпредставления.
, если эффективность не была проблемой, я бы выбрал
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
обратите внимание, однако, что эта реализация всегда линейно ищет минимум (в то время как для большого количества списка один может пожелать сохранить кучу и т. д.)
Примерно так должно работать:
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]
Основные проблемы с использованием ядра Linux для замены микроконтроллерных систем связаны с управлением устройствами, с которыми вы взаимодействуете. Для этого вам, возможно, придется написать драйверы. Я бы сказал придерживайтесь C в качестве языка, потому что вы хотите, чтобы пользовательское пространство было как можно более чистым. Более компактную стандартную библиотеку можно найти в библиотеке uclibc .
Вы также можете найти busybox полезным. Это предоставляет множество утилит пользовательского пространства в виде единого двоичного файла.
Тогда это просто вопрос загрузки из некоторого хранилища в работающую систему и запуска некоторой управляющей логики через init, который взаимодействует с с вашим оборудованием. При необходимости вы можете получить доступ к действующей системе и запустить утилиты busybox. В самом деле, единственное отличие состоит в том, что пространство пользователя намного меньше, чем в обычном дистрибутиве, и вы будете работать «ближе» к ядру с точки зрения целей.
Также обратите внимание на Linux реального времени.
http: //www.realtimelinuxfoundation .org /
Если вам нужно формальное обещание завершения задачи. Я подозреваю, что самым сложным будет загрузка / постоянное хранилище и взаимодействие с вашим оборудованием, если оно экзотическое. Если вы не знакомы с загрузкой Linux, тогда
http://www.cromwell-intl.com/unix/linux-boot.html
Может помочь.
Короче говоря, если вы еще не разработали глубоко для Linux, если вы создали свой собственный дистрибутив или имеете опыт работы с ядром, тогда вы можете найти программирование трудным .
В отличие от других постов, я бы имел бы слияние :: [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 []