#haskell
#haskell
Вопрос:
Я пытаюсь решить проблему с минимальным количеством символов, но система тестирования не хочет принимать код с last
, только !!
. В чем разница между last someList
и someList !! (length someList - 1)
? Данные.Список импортируется.
Комментарии:
1. Напишите свои собственные реализации
last
и!!
иlength
, и убедитесь сами.2. Они эквивалентны. В зависимости от оптимизации я ожидаю
someList !! (length someList - 1)
, что она будет медленнее, поскольку она сканирует список дважды, а не только один раз. Это может сделать его плохим потребителем, поскольку список не может быть немедленно собран мусором во время выполнения первого сканирования.3.
head (reverse someList)
короче.
Ответ №1:
Ответ на этот вопрос кажется довольно очевидным, но мне было достаточно любопытно узнать об этом вопросе, чтобы подтвердить его с помощью QuickCheck. Для непустых списков, действительно, кажется, нет никакой разницы между last someList
и someList !! (length someList - 1)
. Для пустых списков оба выражения приводят к ошибкам; Я полагаю, вы могли бы подчеркнуть тот факт, что результирующие сообщения об ошибках отличаются, но даже в этом случае я бы сказал, что это не представляет никакой реальной разницы в поведении.
Ответ №2:
Да, разницы нет. Ошибка в системе тестирования =)
Ответ №3:
last
реализуется постепенно foldl
(!!)
foldr
. Я полагаю, что его порядок вычисления приводит к разным результатам.