LINUX.ORG.RU

haskell


0

0

есть программка

new_x = [ x | x <- [1..], x<10]
main = print(new_x)

как я понимаю, она должна напечатать список от 1 до 9. Висит. Как объяснить? (сильно не пинать, второй день про существование функциональных языков знаю))


Ну а что еще должна сделать функция, когда ей сказано перебрать все числа и вернуть из них те, которые меньше 10?

mo3r
()
Ответ на: комментарий от mo3r

подумать вместо меня... и выдать все те, что меньше 10 )) В общем, понял. Не понял только, зачем нужны в хаскеле бесконечные списки, если на них все равно вот такая вот фигня происходит

fizteh
() автор топика
Ответ на: комментарий от fizteh

>Не понял только, зачем нужны в хаскеле бесконечные списки

ровно для тех же целей, как и бесконечные структуры в других языках

Pi ★★★★★
()
Ответ на: комментарий от Pi

def is_prime(n):
    return not any(n % k == 0 for k in xrange(2,n))

print is_prime(2)
print is_prime(3)
print is_prime(5)
print is_prime(7)
print is_prime(9)

True
True
True
True
False

Pi ★★★★★
()
Ответ на: комментарий от fizteh

> Не понял только, зачем нужны в хаскеле бесконечные списки, если на них все равно вот такая вот фигня происходит

factorials = 1 : zipWith (*) [1..] factorials

Простейший пример. Зачем его обрубать на каком-то элементе? Пусть компилятор это сделает сам.

Miguel ★★★★★
()
Ответ на: комментарий от imp

>main = takeWhile (<10) [1..]

поработаю lambdabot'ом:

main :: IO ()
takeWhile (<10) [1..] :: (Enum a, Ord a, Num a) => [a]

типы, соответственно, не совпадают
чтобы исправить этот момент, нужна функция типа [a] -> IO ()
уже упоминавшийся print:

print :: (Show a) => a -> IO ()

если a принадлежит классу Show, то и [a] тоже принадлежит классу Show
соотвественно:

print [1..9] :: IO ()

итого искомая функция будет выглядеть так:

main = print $ takeWhile (<10) [1..]

P.S. писался этот ответ прежде всего для топикстартера

jtootf ★★★★★
()
Ответ на: комментарий от imp

>Сам хотел исправить да забил...

да я понял, просто чтобы спрашивающего не запутать окончательно расписал всё :)

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

Если расписывать ВСЁ, то надо ещё не забыть про функцию ($) :: (a -> b) -> a -> b

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.