2013-03-26 2 views
4

Это, вероятно, довольно очевидный вопрос, но я просто не могу понять это.Haskell Even Function?

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

module SquareEvens where 

squareEvens :: [Integer] -> [Integer] 

squareEvens n = [ns * ns | ns <- n, even n] 
+5

Функция работает отлично для меня, если вы меняете «даже n» на «даже ns» –

+0

yep! это закрепило его! вау, дух. –

+21

В несвязанной заметке по условному 'ns' часто указывает список, а' n' указывает элемент из этого списка. Возможно, вы захотите переключить свои 'n' и' ns', чтобы следовать общему использованию Haskell. – kputnam

ответ

11

код работает отлично, если вы измените even n на even ns:

squareEvens n = [ns * ns | ns <- n, even ns] 

Но обратите внимание, что конвенция использовать множественное число, чтобы назвать список и единственного числа имени элемента из этого списка. Так своп n и ns следовать идиоматическое использование Haskell:

squareEvens ns = [n * n | n <- ns, even n] 
7

Как вы можете видеть, это легко получить имена переменных неправильно. Так почему бы не сделать это без?

squareEvens = map (^2) . filter even 

Я думаю, что это яснее понимания. Вы можете прочитать его справа налево: Держите только четные числа, а затем квадратные.