Найти, делится ли число в диапазоне чисел

#haskell #recursion

Вопрос:

Я хочу сравнить целое число (rstart) с целым числом (числом) следующим образом (C-код):

 #include <stdio.h>
#include <stdlib.h>

int main (void){
    int rstart = 15, rend = 25, number = 629;
    while (rstart <= rend){
        rstart  ;
        if (number % rstart == 0){
            return number % rstart;
        }
    }   
    return number % rstart;
}
 

Теперь я знаю, как написать что-то подобное на c или python, но я понятия не имею, как это сделать в Haskell.

Я начал со следующего:

 dividesRange :: Integer -> Integer -> Integer -> Bool
dividesRange number rstart rend = 
 

Я не знаю, как бы я реализовал цикл while из C в Haskell. Я знаю, что мог бы использовать все операторы if, но, на мой взгляд, это неэффективно. Есть ли простой способ записать это в Haskell?

Ответ №1:

 dividesRange :: Integer -> Integer -> Integer -> Bool
dividesRange number rstart rend = go rstart where
  go x
    | x > rend = False
    | otherwise = number `rem` x == 0 || go (x 1)
 

Как это работает:

  1. Мы используем вспомогательную функцию go .
  2. Базовым случаем является when x (rstart), больше, чем rend . В этом случае мы возвращаем False .
  3. В противном случае мы проверяем, равен ли остаток от number деления на x ноль. Если это так, мы возвращаем True и не повторяем дальше.
  4. В противном случае мы увеличиваем x и вызываем go снова.

Используя any , мы можем переписать вышесказанное следующим образом:

 dividesRange2 :: Integer -> Integer -> Integer -> Bool
dividesRange2 number rstart rend = any (x -> number `rem` x == 0) [rstart..rend]