2013-01-31 3 views
3

Пытается создать программу Haskell, которая увеличивает каждое число в списке на единицу.Haskell Increment by One

module Add1List where 
add1_list_comp :: [Integer] -> [Integer] 
add1_list_comp [x] = [x + 1| x <- [x]] 

Это работает, когда я называю это add1_list_comp [3] ... это дает мне [4]

Но когда я add1_list_comp [3, 4, 5] ... он бросает мне ошибку говоря

«неисчерпывающих узоры в функции add1_list_comp "

Любая помощь будет очень признательна!

+3

[Awesome resource] (http://learnyouahaskell.com/) для изучения Haskell. –

+1

Переписывание списков в терминах 'map',' concat' и т. Д. Часто делает код более понятным. – singpolyma

ответ

6
add1_list_comp = map succ 

что просто

или в пути

add1_list_comp xs = [x + 1| x <- xs] 

проблема с вашим кодом, что

add1_list_comp [x] 

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

+3

Это «gimme teh codez answer» (ну, ладно, вы отредактировали так не так много) ... Я думаю, что было бы выгоднее как для OP, так и для будущих пользователей SO, если бы ответ более подробно рассказал о том, что в этом решении. Помните, что хотя это может быть совершенно тривиально для вас, OP явно является новичком и может нуждаться во многих «очевидных» вещах, которые явно указываются и объясняются. –

+0

Да! Я девственник! Благодарю за помощь. Очевидное исправление, хотя lol –

+0

Фактически операции списка описаны во многих местах, поэтому я не вижу смысла изобретать колесо. Если вы задаете вопрос - кто-то дает ответ. То, как это работает в моем мнении. Если OP не понимает, какие списки и какие операции в списке доступны, он не является объектом полного копирования. – jdevelop

4

Я вижу, что на вопрос был дан ответ, но, возможно, я могу объяснить немного больше. Аргументом функции является модель соответствует, а общие правила

(x:xs) 

х глава списка и хз есть хвост из списка и потенциально пустой список

[] 

пусто список

[x] or (x:[]) 

те же что список только с одной переменной

и имя без конструктора, такое как «[]», «:», «(,)» вокруг, могут совпадать с чем угодно, поэтому, если вы хотите соответствовать специальному случаю, вы должны поместить специальный случай перед общим шаблоном ,

length [] = 0 
length [x] = 1 
length (x : xs) = 1 + length xs 

BTW, вообще говоря, всегда будет функция более высокого порядка, если вы хотите что-то сделать со списком. для случая

add1 xs = map (+1) xs 

симпатичнее и воспользовался встроенной в библиотеке, и вы также можете сделать точку бесплатную версию этого

add1 = map (+1) 
0

Ну на самом деле, так как тема состояний Increment»одним «без определения того, какой тип будет увеличиваться на единицу, только ради посетителя, который оказался здесь, давайте дадим решение, которое увеличит любой функтор на один, что, конечно, включает в себя тип списка.Так;

Список функтор

*Main> fmap (+1) [1,2,3] 
[2,3,4] 

Может быть, функтор (id относится к Nothing)

*Main> fmap (+1) (Just 1) 
Just 2 

Либо функтор (id относится к Left _)

*Main> fmap (+1) (Right 2) 
Right 3 

IO функтор

*Main> fmap ((+1) . read) getLine 
2017 
2018