Haskell Просто перебрать список

Я пытаюсь просто перебрать список и вернуть каждый элемент.

iterateList [] =  error "empty list"
iterateList [a] = a
iterateList (x:xs) = x iterateList xs

В третьей строке я пытаюсь вернуть первый элемент, а затем рекурсивно вызвать iterateList в конце списка.

Но это не работает. Есть идеи почему?

Пример: input: iterateList [1,2,3,4,5] output: 1 2 3 4 5

1 ответ

Решение

То, что я хочу, это просто пример цикла for в Java, где я могу сделать что-то с каждым элементом в списке, например, печать, суммирование, умножение, удаление, просто доступ к этим элементам

Ну, вы не можете ничего "удалить" в Haskell и не можете изменять привязки. Что вы можете сделать, например, суммировать элементы:

sumList [] = 0
sumList (x : xs) = x + sumList xs

Или умножьте элементы:

productList [] = 1
productList (x : xs) = x * productList xs

В этот момент вы можете понять, что вы повторили себя немного, что раздражает. Вы можете извлечь общие части и превратить различия в параметры:

iterateList f z [] = z
iterateList f z (x : xs) = x `f` iterateList f z xs

sumList     = iterateList (+) 0
productList = iterateList (*) 1

Вот z представляет "базовое значение", которое будет возвращено для пустого списка ввода, и f это функция "объединить", которая сообщает, как обращаться с элементом и остальной частью списка.

Печать немного сложнее, потому что вы должны знать, как IO работает в первую очередь (в частности, вы должны знать о >> а также return), но это еще можно сделать:

doNothing           = return ()
printAndThen x rest = print x >> rest

printList = iterateList printAndThen doNothing 

... или напрямую использовать значения вместо привязки их к именам:

printList = iterateList (\x rest -> print x >> rest) (return ())

Наконец, вы бы поняли, что вы только что заново изобрели foldr,:-)

Другие вопросы по тегам