Изучение Haskell: Как реализовать собственную версию функции init - PullRequest
3 голосов
/ 12 февраля 2010

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

Вот что я сделал до сих пор.

init' :: [Int] -> [Int]
init' [] = error "This function cannot be applied to an empty list"
init' [x] = [x]
init' (x:xs) = x : init' xs

Ответы [ 4 ]

12 голосов
/ 12 февраля 2010

Ваша проблема - ваш базовый случай. Здесь:

init' [x] = [x]

Вы говорите, что когда вы переходите к списку с одним элементом, вы хотите вернуть тот же список. Это не желаемый результат. Если у вас есть список с одним элементом, вы хотите вернуть пустой список (все, кроме последнего элемента для одного элемента, являются пустым списком).

init' [x] = []

Что касается примечания, вы, вероятно, должны объявить его как

init' :: [a] -> [a]

Использование «a» в качестве типа обобщает его в списки чего угодно, в отличие от просто Ints. Таким образом, вы можете вызвать init 'в любом списке. Например, init '"abcde" даст вам "abcd"

4 голосов
/ 12 февраля 2010

Ваше второе правило должно быть:

init' [x] = []

Если список имеет только один элемент, то он является последним, поэтому список без последнего элемента является просто пустым списком.

3 голосов
/ 12 февраля 2010
init' [x] = [x]

Это не правильно. Если вы удалите последний элемент одноэлементного списка, вы не вернетесь к тому же списку, вы вернетесь к пустому списку.

0 голосов
/ 24 декабря 2011

Вот моя версия, попробуйте это.

init' :: [a] -> [a]

init' []  = error("This is not right, empty list is not allowed here")
init' (x:[]) = [x]
init' (x:xs:[]) = [x]
init' (x:xs) = x: init' xs
...