2016-01-28 2 views
-3

Я изучаю функциональное программирование. Я понял принцип, и теперь я пытаюсь узнать особенности. Этот код должен выяснить, является ли n простым или нет. Я не понимаю, что делает первая строка. Я предлагаю, чтобы целое число было логическим значением в функции (вы называете это?) 'IsPrime'.У меня проблемы с пониманием синтаксиса этого кода. Может ли кто-нибудь объяснить это за строкой?

Линии 2-4 являются своего рода реализацией эквивалента определения, если по модулю n/x равен нулю с отсчетом x, исключая n в качестве фактора.

Пожалуйста, помогите мне с этим. благодарим вас заранее.

код в вопросе:

isPrime :: Integer -> Bool 
isPrime n = (factors n == []) -- (1) 
    where 
factors n = [ x | x <- [2..n-1], n `mod` x == 0 ] 
+1

Первая строка - это определение типа (подпись) для функции. Это означает, что 'isPrime' - это функция от' Integer' до 'Bool'. Таким образом, он принимает число и возвращает логическое значение, является ли оно простым или нет. Это необязательно, но это хорошая привычка всегда ставить его там. – zerkms

+1

[Здесь] (http://learnyouahaskell.com/chapters) - неплохое место для начала. – molbdnilo

+4

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

ответ

2
isPrime :: Integer -> Bool 

является тип подписи. Он объявляет isPrime функцией, которая принимает Integer и возвращает Bool.

isPrime n = (factors n == []) 

(factors n == []) является органом определения isPrime «s. isPrime принимает один аргумент, n, а затем вызывает factors n, чтобы узнать, равен ли он пустым спискам. То есть, если n не имеет факторов, то он является простым.

where 

просто устанавливает определение factors так оно контекстное к isPrime, в основном.

factors n = [ x | x <- [2..n-1], n `mod` x == 0 ] 

является настоящим мясом и костями этой программы, поэтому он выполняет большую работу. Прежде всего, factors принимает один аргумент, n. Затем он создает список, используя понимание списка.

[ x | x <- [2..n-1], n `mod` x == 0 ] 

можно прочитать как «составить список целых чисел x от 2 до п - 1, что n делится на x не дает остаток». Что в основном проверяет, делится ли n на x; если это так, x - фактор of n.

+0

Хорошо, отлично. Это было отличное объяснение @mipadi. Спасибо вам за это. Но об этом 'x': Как и где он начинается? Как это определяется? Каким будет выход программы? Как это получается? И что напоминает '' '? Спасибо заранее. – BlkPengu

+0

@BlkPengu: Этот синтаксис является «пониманием списка». В общем случае '[x | xs] 'означает' 'x ', где' x' - из набора 'xs'. Выше было бы эквивалентно математическому обозначению «{x | x находится в диапазоне от 2 до n - 1, а n делится на x}". (Действительно, синтаксис Haskell призван вызывать обозначение набора.) – mipadi

+0

спасибо за быстрый ответ @mipadi.можете ли вы рассказать мне что-то о вопросах ввода и вывода? – BlkPengu

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