NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Вы можете использовать tails
:
gather n l = filter ((== n) . length) $ map (take n) $ tails l
или использовать takeWhile
вместо filter
:
gather n l = takeWhile ((== n) . length) $ map (take n) $ tails l
EDIT: вы можете удалить шаг фильтра на отбрасывая последние n
элементы списка, возвращенные из tails
, как предложено в комментариях:
gather n = map (take n) . dropLast n . tails
where dropLast n xs = zipWith const xs (drop n xs)
Отбрасывание хвостов может быть организовано автоматически, благодаря свойствам zipping ,
import Data.List (tails)
g :: Int -> [a] -> [[a]]
g n = foldr (zipWith (:)) (repeat []) . take n . tails
, или просто transpose . take n . tails
. Тестирование:
Prelude Data.List> g 3 [1..10] [[1,2,3], [2,3,4], [3,4,5], [4,5,6], [5,6,7], [6,7,8], [7,8,9], [8,9,10]] Prelude Data.List> транспонировать. возьмите 3. хвосты $ [1..10] [[1,2,3], [2,3,4], [3,4,5], [4,5,6], [5,6,7], [ 6,7,8], [7,8,9], [8,9,10], [9,10], [10]]
blockquote>
zipWith enumFromTo
создает списки целых чисел, которые имитируют результат, но что, если нам нужно изменить результат sort ([1,4..20] ++ [1,5..30])
? Реорганизация игнорирует природу элементов и просто управляет структурой списка i>, независимо от того, что она содержит. Как и в списке, была цепочка ящиков (каждая из которых содержит некоторый элемент), и мы работаем с полями, а не с тем, что в i>. (флаги not i> фактически сохраняют значения, а удерживают указатели i> для этих значений - каждый ящик содержит один указатель).
– Will Ness
3 April 2018 в 07:39
[a]
является параметрическим i> типом,« списком » 'something' < / i>, что бы это ни было " - что something i> является параметром a
в типе [] a
, то есть [a]
. Поэтому, когда мы переустанавливаем список, мы создаем новую «структуру списка». то есть новые цепочки ящиков, содержащие новые указатели с теми же значениями i>, которые были в исходных полях. Так же, как это делается в Лиспе.
– Will Ness
3 April 2018 в 07:39
set-car!
или set-cdr!
. Не так в Хаскелле. Но концептуально эта модель предотвращает чрезмерное копирование значений при перестановках, что было бы неизбежным, если бы мы сказали, что у нас есть коробки со значениями, фактически находящимися в in i> (новая цепочка будет хранить копии значений в своих полях). Конечно, в Haskell, с его ссылочной прозрачностью, скопированное значение нельзя отличить от нового указателя на одно и то же значение (с нормальными значениями Haskell), за исключением эффектов performance i> (размер памяти, скорость , количество GC (сбор мусора) и т. д.).
– Will Ness
3 April 2018 в 07:49
takeWhile
вместоfilter
, но это довольно скромная оптимизация. – Carl 6 July 2014 в 21:16(iterate (drop 1) s)
вместо$ tails l
... – גלעד ברקן 6 July 2014 в 21:38n
элементов списка», который является\xs -> zipWith const xs (drop n xs)
; возможно, вы могли бы использовать этот трюк здесь. – Daniel Wagner 7 July 2014 в 00:13