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
,:-)