2013-02-19 3 views
2

В моем тестовом экзамене вопрос был, что делает этот метод.Haskell: что делает этот метод

dos a = ([x | x <- [2..div a 2], mod a x == 0] == [])

Я новичок в Haskell, но, насколько я могу сказать, он проверяет, если результат dos a = ([x | x <- [2..div a 2], mod a x == 0]) является пустым списком. Также x - все числа a, деленные на 2, у которых есть% number == 0. Таким образом, это все четные числа? Кажется, он проверяет, может ли число делиться через 2, если да -> false, иначе иначе. Может ли кто-нибудь объяснить мне семантику в деталях?

+8

Лучший способ узнать это - разбить выражение на несколько функций и оценить их в REPL. '[2..div a 2]' возвращает список целых чисел от 2 до a/2. – Simon

ответ

9

Вы близко к тому, что происходит. Есть несколько компонентов для понимания.

Во-первых, [2 .. div a 2] генерирует список номеров от 2 до floor(a/2).

Далее mod a x == 0 отфильтровывает значения от 2 до floor(a/2), которые делят a (например, он находит все факторы a). Таким образом, список генерируется

[x | x <- [2 .. div a 2], mod a x == 0] 

содержит все числа, которые делят a.

И, наконец, == [] проверяет, что этот список пуст (например, a не имеет факторов). Итак, что эта функция на самом деле делает, чтобы определить, является ли число простым, пытаясь генерировать свои факторы, которые легко видеть, когда вы используете dos как предикат для фильтра:

Prelude> let dos a = ([x | x <- [2..div a 2], mod a x == 0] == []) 
Prelude> :t dos 
dos :: Integral t => t -> Bool 
Prelude> filter dos [2 .. 100] 
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97] -- Prime goodness 
6

It является основным алгоритмом для проверки того, является ли число простым или нет. Он пересекает все числа от 2 дои проверяет, не делятся ли какие-либо из них a, если список пуст, то это означает, что он не имеет факторов между 2 и a/2, что означает, что число является простым.

+0

Этот алгоритм * bad *. Нужно проверить только, если число делится на ** простые числа **, квадрат которых не больше числа. – Ingo

+0

@Ingo Я ничего не говорю об алгоритме. Это был вопрос, заданный на его экзамене, поэтому я просто объясняю, что он делает. Вы просто не можете ответить на вопрос на экзамене: «Ваш алгоритм не оптимален, поэтому я не буду отвечать на этот вопрос». – Satvik

+2

Я знаю, я просто хотел упомянуть об этом, чтобы никто не думал, что это какой-то, но глупый алгоритм вопроса о домашнем задании. – Ingo

Смежные вопросы