Мне нравится - Стена и строгие прототипы, а также определения неявной функции. Ошибки на тех могут быть очень полезными. Существует также-Wextra, который возьмет весь виды из вещей как вещи, Вы намеревались быть условными выражениями, но случайно записали как операторы:
if (something);
classic_way_to_leak_memory();
В подобных Unix системах необходимо повиноваться огибающим предпочтениям пользователя.. таким образом, что они видят и отчет мог бы совершенно отличаться, чем, в чем Вы нуждаетесь:)
я - также тип, каламбурящий злодей, таким образом, я склонен устанавливать-Fno-strict-aliasing также, если пользователь не хочет его. Безопасное управление памятью в классике C трудно выполнить иначе.
Вам просто нужна отдельная переменная.
Prelude> let divisors n = [x | x <- [1..(n-1)], n `rem` x == 0]
Prelude> divisors 20
[1,2,4,5,10]
Prelude> divisors 30
[1,2,3,5,6,10,15]
Теперь, если вы хотите сделать его немного более эффективным, мы уже знаем, что делитель не будет больше половины n
, и мы знаем, что 1 является делителем всего. И, давайте продолжим и сделаем его немного более Haskell-y для загрузки, избегая понимания списка:
Prelude> let divisors n = 1 : filter ((==0) . rem n) [2 .. n `div` 2]
Prelude> divisors 20
[1,2,4,5,10]
Prelude> divisors 30
[1,2,3,5,6,10,15]
Prelude> divisors 31
[1]