2016-11-06 13 views
0

Мне нужно написать функцию, которая принимает все положительные числа из списка Integer, добавляет к каждому 10, а затем суммирует их все, пока не достигнет maxNum.Haskell Как получить сумму всех положительных членов, используя функцию композиции?

Я уже писал что-то, что вроде работает:

ff :: Integer -> [Integer] -> Integer 
ff maxNum = (<=maxNum) . sum . map(+10) . filter(>0) 

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

ответ

3

Вам нужна подвижная сумма, например. что-то вроде

rollingSum [1..10] = [0,1,3,6,10,15,21,28,36,45,55] 

В конце концов, sum только даст вам сумму окончательный, где вы должны проверить промежуточные.

К счастью, scanl (+) 0 предоставляет эту функциональность. Таким образом, вы можете взять номера этой прокатной суммы до тех пор, как они меньше maxNum, а затем last элемент:

ff maxNum = last . takeWhile (<= maxNum) . scanl (+) 0 . map (+10) . filter (> 0) 
+0

Это не работает, как это должно быть ... может быть, вы не поняли мой вопрос ... когда я вызываю свою функцию с этими параметрами «ff 26 [2, -3, 4]« Я должен получить результат значения 26, потому что (2 + 10) + (4 + 10) <= 26 .. Ваш подход просто дает мне последнее число, увеличенное на 10 –

+1

@ NikasŽalias это не так. '(\ maxNum -> last. takeWhile (<= maxNum). scanl (+) 0. map (+10). filter (> 0)) 26 [2, -3,4]' is 26. Действительно ли вы использовали 'scanl' (__and__' takeWhile'?) – Zeta

+0

извините, моя ошибка, как-то haskell ошибочно скомпилирована, не все в порядке .. спасибо !!!!!! –