разница между функциями для получения последнего элемента в Haskell

#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 . Я полагаю, что его порядок вычисления приводит к разным результатам.