2016-01-19 2 views
1

У меня есть этот код, который генерирует простые числа от 2 до пПередача списка в другой функции

primes :: Integer -> [Integer] 
primes n = sieve [2..n] 
where 
sieve (p:xs) = p : sieve [x|x <- xs, x `mod` p > 0] 

Как передать список sieve D (который имеет свои простые числа) на другую функцию?

Что-то вроде этого не работает (ошибка синтаксического анализа)

someText:: [Integer] -> String 
someText (x:[]) = "List starts with" ++ show x 

primes :: Integer -> [Integer] 
primes n = sieve [2..n] 
where 
sieve (p:xs) = p : sieve [x|x <- xs, x `mod` p > 0] 
someText sieve 

ответ

3

Вы не делаете передача что-то функции, как какой-то список. Это обязательное мышление. Что вы делаете в Haskell, вы оцениваете некоторые функции, например. список в качестве аргумента. Обычно вы просто оставляете primes как есть и используете результат в качестве аргумента для someText. Как & dagger;,

main :: IO() 
main = print (someText $ primes 100) 

или просто в РЕПЛ

GHCi> someText $ primes 100 
"List starts with2" 

Конечно, вы можете также переопределить primes включить someText. Но, очевидно, результат будет теперь строкой, а не списком!

primes' :: Integer -> String 
primes' n = someText $ sieve [2..n] 
where sieve (p:xs) = p : sieve [x|x <- xs, x `mod` p > 0] 

Это, вероятно, лучше не делать этого, потому что такая строка довольно бесполезно, когда вы хотите использовать простое список любым другим способом. Вы можете лучше всего вызвать оригинальную primes функции:

primes' :: Integer -> String 
primes' = someText . primes 

& кинжал; На самом деле это не работает: ваша функция someText не является полной. Образец x:[]только соответствует списку, который имеет ровно один элемент (это более удобно написано someText [x] = ...). Вы хотите совместить на список, который начинается с одного элемента; сделайте это с рисунком x:_.

+1

Спасибо, теперь я вижу, что мне нужно больше узнать о Haskell: D – Cardano