Написание двух функций, которые возвращают первый и последний элемент списка в Haskell - PullRequest
0 голосов
/ 09 апреля 2020

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

firstList :: [Integer] -> Integer
firstList [] = 0
firstList (_:xs) = head xs

lastList :: [Integer] -> Integer
lastList [] = 0
lastList (_:xs) = (last) xs

Кажется, что работает функция lastList, но не firstList. Например, для списка [3, 1, 2, 4]; он возвращает 1, а не 3. Как я могу улучшить свой код?

Ответы [ 2 ]

5 голосов
/ 09 апреля 2020

Вы, кажется, смешиваете два возможных подхода к этой проблеме:

  1. Подход без усилий

    firstList :: [Integer] -> Integer
    firstList = head
    

    ... или с помощью β-расширения firstList xs = head xs. Это просто вызывает стандартную функцию head, ничего не делая. Это, безусловно, способ решения проблемы, но, вероятно, не тот, который ожидается в этой задаче.

  2. Полностью ручной подход

    firstList [] = ...
    firstList (x:xs) = ...
    

    В этой настройке вы Вы ничего не вызываете из библиотек, а вручную выясняете, что делать с головой и хвостом (если есть) списка. Что ж, для firstList это достаточно просто: вы просто используете элемент head, то есть x. Больше ничего не нужно делать, больше не нужно вызывать функцию.
    OTOH, для lastList вам действительно нужно сделать еще немного. В частности, как прокомментировал Чи, вы фактически не обрабатываете случай с 1 элементом, потому что вы всегда убираете головной элемент, если он есть. Если это элемент only , то last не работает ни с одним из них. То, что вы действительно должны делать, это вовсе не вызывать стандартную функцию, а вместо этого обрабатывать все соответствующие случаи вручную и recurse с вашей собственной функцией.

    lastList [] = ...
    lastList [x] = ...
    lastList (_:xs) = lastList xs
    
0 голосов
/ 30 апреля 2020

Как я понимаю этот вопрос, вы хотите, чтобы две функции возвращали 0, когда дан пустой список, и, соответственно, первый или последний элемент соответственно.

Haskell код:

firstList :: [Integer] -> Integer
firstList [] = 0
firstList (x:_) = x

В вашем коде xs - оставшаяся часть списка и, следовательно, head возвращает второй элемент исходного списка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...