WedX - журнал о программировании и компьютерных науках

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, иначе иначе. Может ли кто-нибудь объяснить мне семантику в деталях?

19.02.2013

  • лучший способ выяснить это — разбить выражение на несколько функций и вычислить их в REPL. [2..div a 2] возвращает список целых чисел от 2 до a/2. 19.02.2013

Ответы:


1

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

Сначала [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
19.02.2013

2

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

19.02.2013
  • Этот алгоритм плох. Проверять нужно только то, делится ли число на простые числа, квадрат которых не больше числа. 19.02.2013
  • @Ingo Я ничего не говорю об алгоритме. Это был вопрос, заданный им на экзамене, поэтому я просто объясняю, что он делает. Вы просто не можете ответить на экзаменационный вопрос о том, что ваш алгоритм не оптимален, поэтому я не буду отвечать на этот вопрос. 20.02.2013
  • Я знаю, я просто хотел упомянуть об этом, чтобы никто не подумал, что это что-то вроде глупого алгоритма домашнего задания. 20.02.2013
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]