За последнюю неделю появилось несколько топиков с названием «10 однострочников на <MY_LANGUAGE>, которые произведут впечатление на ваших друзей», которые содержат однострочное решение нескольких простых задач, демонстрирующее достоинства и «крутость» любимого языка программирования автора. Я решил перевести их и для сравнения собрать в одном топике. Вся волна началась (вроде как) со Scala.
Итак, поехали!
Это 10 однострочников, демонстрирующих мощь языка Scala, чтобы произвести впечатление на ваших друзей и, может быть, даже женщин :). К тому же они являются отличными примерами использования функционального программирования и синтаксиса языка Scala, с которым вы, возможно, не знакомы. Я думаю, что нет лучшего способа изучить его, чем увидеть реальные примеры.
Автор: Marcus Kazmierczak
Вы, возможно читали пост "10 однострочников на Scala, чтобы произвести впечатление на ваших друзей" в блоге Marcus Kazmierczak, недавно размещенный на HN. Хоть я и не знаю Scala (или Java), но это выглядит отлично, поэтому я тоже решил произвести впечатление на моих друзей — некоторые переходят с Java на Scala, мы идем из Javascript в CoffeeScript. Будем использовать node.js как среду для запуска всех примеров.
»
Автор: Ricardo Tomasi
В духе of 10 "10 однострочников на Scala, чтобы произвести впечатление на ваших друзей" вот некоторые однострочники на F#:
Автор: Will Fitzgerald
Был опубликован список из 10 однострочных примеров, которые призваны показать выразительность Scala. Версия CoffeeScript появились быстро, так что я думал, что опубликовал Ruby-версию один. Я считаю, что синтаксис Ruby немного чище, чем Scala, но в сущности (по крайней мере, насколько показывают эти примеры) относительно аналогичный.
Оригинальный пост: «10 Ruby One Liners to Impress Your Friends»
Автор: Antonio Cangiano
Я увидел интересный пост сегодня под названием "10 однострочников на Scala, чтобы произвести впечатление на ваших друзей", а затем кто-то опубликовал в другом блоге пост под названием "10 однострочников на CoffeeScript, чтобы произвести впечатление на ваших друзей". Эти два поста показывают небольшие задачки (большинство из них имеют тривиальные решения в современных языках программирования), каждая их которых выполнены в примерно 1 строку кода.
Я думаю будем уместно сделать тоже самое для моего любимого языка программирования — Clojure.
Автор: Baishampayan
После 10 удивительных однострочников на Scala/Ruby/Clojure/CoffeeScript, я подумал, что будет интересно сделать тоже самое на Python.
Без особого шума… поехали. Обратите внимание, что объявления переменных и импорты в отдельных строки по мере необходимости. Также каждая строка написана так, чтобы выводить результат на стандартный вывод для быстрой проверки.
Этот пост, возможно, один из самых быстрых, что я писал.
Автор: Dhananjay Nene
Автор: Richard Birkby
Соледуя за мемом (scala, ruby, clojure, python, f#, coffeescript, c#).
Автор: Michael Fogus
А теперь ваши варианты,и да начнутся холивары! )
Итак, поехали!
Scala
Это 10 однострочников, демонстрирующих мощь языка Scala, чтобы произвести впечатление на ваших друзей и, может быть, даже женщин :). К тому же они являются отличными примерами использования функционального программирования и синтаксиса языка Scala, с которым вы, возможно, не знакомы. Я думаю, что нет лучшего способа изучить его, чем увидеть реальные примеры.
Удваиваем каждый элемент списка
Функцияmap
берёт каждый элемент списка и применяет к нему соответствующую функцию. В данном примере, мы берём каждый элемент и умножаем его на 2. В результате будет возвращён список такого-же размера в отличии от других примеров, использующих функцииreduceLeft
иfoldLeft
, которые возвращают только одно не списковое значение.
В комментария к оригинальной статье также был предложен вариант:(1 to 10) map { _ * 2 }
(1 to 10) map (2*)
Суммируем все числа в списке
Наиболее распространенным примером использованияreduceLeft
является суммирование чисел в списке. В этом примере суммируются числа от 1 до 1000 с использованием функций диапазонаto
для создания нашей последовательности чисел иreduceLeft
для итерации и суммирования.
В комментариях к оригинальной статье был предложен лучший вариант:(1 to 1000).reduceLeft( _ + _ )
(1 to 1000).sum
Проверяем вхождение подстроки
Этот пример возвращает булево значение если слово из списка входит в указанную строку. Я использовал этот пример для проверки того, что твит содержит интересующее меня слово. Да, технически это три строки, но первые две — это просто задание переменных.
В комментариях к оригинальной статье был предложен лучший вариант:val wordlist = List("scala", "akka", "play framework", "sbt", "typesafe") val tweet = "This is an example tweet talking about scala and sbt." (words.foldLeft(false)( _ || tweet.contains(_) ))
... wordList.exists(tweet.contains(_))
Чтение из файла
Этот пример может быть впечатляющим на фоне Java, это довольно общий пример чтения файла одной строкой. На самом деле здесь два примера: один читает весь файл в строку, другой считывает файл построчно в список.val fileText = io.Source.fromFile("data.txt").mkString val fileLines = io.Source.fromFile("data.txt").getLines.toList
С днём рожденья!
Однострочник, который выводит песенку «Hapy Birthday». Он иллюстрирует тернарный оператор Scala, а также сочетаниеmap
иforeach
.(1 to 4).map { i => "Happy Birthday " + (if (i == 3) "dear NAME" else "to You") }.foreach { println }
Фильтрация списка чисел
Фильтрация списка чисел на две категории, основанные на использованииpartition
. В этом примере создаются два списка студентов по результатам их тестирования.val (passed, failed) = List(49, 58, 76, 82, 88, 90) partition ( _ > 60 )
Получение и разбор XML от веб-сервиса
Так как XML является нативной структурой Scala, разбор XML происходит без каких-либо усилий. Вот пример извлечения фида поиска Twitter.val results = XML.load("http://search.twitter.com/search.atom?&q=scala")
Поиск минимума (или максимума) в списке
Ещё пара примеров использованияreduceLeft
для перебора списка и применения функции.
В комментариях к оригинальной статье был предложен лучший вариант:List(14, 35, -7, 46, 98).reduceLeft ( _ min _ ) List(14, 35, -7, 46, 98).reduceLeft ( _ max _ )
List(14, 35, -7, 46, 98).min List(14, 35, -7, 46, 98).max
Параллельная обработка
В Scala 2.9 был представлен новый тип коллекции под названием «параллельные коллекции», использующие многоядерные процессоры при выполнении массовых операций, таких какforeach
,map
,filter
и т.д… Вот видео от Александра Прокопец о параллельных коллекциях на Scala Days 2010.
Этот пример иллюстрирует использование параллельных коллекций. Представьте, что у вас есть множество данных, определенных в списке dataList и функция processItem, очень интенсивно использующая процессор. Следующий однострочник даёт вам параллельную обработку списка.val result = dataList.par.map(line => processItem(line))
Решето Эратосфена
Хорошо, на этот раз пример не совсем практический и, технически, не однострочный, поскольку он опирается на оператор, определённый ранее, но он всё-равно чертовски клёвый, пусть даже не читаемый. Даниэль Собрал написал реализацию алгоритма Решето Эратосфена, который используется для того, чтобы определить, является ли число простым.
Требует определения оператора |>, синтаксис которого заимствован из F#. Смотрите, например, в блоге Стива Гилхэма.(n: Int) => (2 to n) |> (r => r.foldLeft(r.toSet)((ps, x) => if (ps(x)) ps -- (x * x to n by x) else ps))
Автор: Marcus Kazmierczak
CoffeScript
Вы, возможно читали пост "10 однострочников на Scala, чтобы произвести впечатление на ваших друзей" в блоге Marcus Kazmierczak, недавно размещенный на HN. Хоть я и не знаю Scala (или Java), но это выглядит отлично, поэтому я тоже решил произвести впечатление на моих друзей — некоторые переходят с Java на Scala, мы идем из Javascript в CoffeeScript. Будем использовать node.js как среду для запуска всех примеров.
Удваивание всех элементов в списке
Маркус начинает хвастаться с функцииmap
. Мы можем сделать то же самое с использованиемrange
и анонимной функции:
но можно написать и в более выразительном виде[1..10].map (i) -> i*2
i * 2 for i in [1..10]
Сумма списка чисел
Javascript (и CoffeeScript в качестве его расширения) также имеют встроенные функцииmap
иreduce
:
(reduce == reduceLeft, reduceRight также доступен)[1..1000].reduce (t, s) -> t + s
Проверка вхождения подстроки
Очень легко, так как у нас есть методsome
. Он возвращает истину, если любому из элементов массива удовлетворяет функция:
А вот это вернёт соответствующие слова:wordList = ["coffeescript", "eko", "play framework", "and stuff", "falsy"] tweet = "This is an example tweet talking about javascript and stuff." wordList.some (word) -> ~tweet.indexOf word
"wordList.filter (word) -> ~tweet.indexOf word
~
" — это не специальный оператор в CoffeeScript, а просто грязный трюк. Это побитовый оператор «НЕ», который инвертирует биты своего операнда. На практике это приравнивается к-x-1
. Здесь он работает на основе того, что мы хотим сделать проверку для индекса больше, чем-1
, и-(-1)-1 == 0
оценивается как ложь.
Чтение файла
Пользователи клиентского JavaScript уже знакомы с этой идеей:
Ещё можно использовать синхронную версию:fs.readFile 'data.txt', (err, data) -> fileText = data
Но в node.js это приемлемо только для процедуры запуска приложений. Вы должны использовать асинхронную версию в вашем коде.fileText = fs.readFileSync('data.txt').toString()
С днём рожденья
Во-первых, можно отобразить Scala-версию один в один:
Но можно и лучше. Это читается почти как псевдо-код:[1..4].map (i) -> console.log "Happy Birthday " + (if i is 3 then "dear Robert" else "to You")
console.log "Happy Birthday #{if i is 3 then "dear Robert" else "to You"}" for i in [1..4]
Фильтрация списка чисел
Фильтрация списка чисел получилась достаточно похожей:
(Можно ещё использовать filter, но тогда не получится однострочника)passed = [] failed = [] (if score > 60 then passed else failed).push score for score in [49, 58, 76, 82, 88, 90]
Получение и разбор XML от веб-сервиса
XML-что? Не слышал о таком. Давайте вместо этого получим JSON:request.get { uri:'path/to/api.json', json: true }, (err, r, body) -> results = body
Поиск минимума (или максимума) в списке
Здесь удобна функцияapply
. Она позволяет вызывать функцию, передавая массив как список аргументов:Math.max
иMath.min
получают переменное число аргументов, т.е.Math.max 30, 10, 20
возвращает30
. Попробуем поработать с массивом:Math.max.apply @, [14, 35, -7, 46, 98] # 98 Math.min.apply @, [14, 35, -7, 46, 98] # -7
Параллельная обработка
Пока что не существует. Вы можете создавать дочерние процессы и взаимодействовать с ними, или использовать WebWorkers API. Пропускаем.
Решето Эратосфена
Не удалось довести это до одной строки. Есть идеи?
Обновление (5 июня): @dionyziz прислал мне компактную версию:sieve = (num) -> numbers = [2..num] while ((pos = numbers[0]) * pos) <= num delete numbers[i] for n, i in numbers by pos numbers.shift() numbers.indexOf(num) > -1
которую мы можем использовать для действительно однострочной версии, похожей на оригинал:primes = [] primes.push i for i in [2..100] when not (j for j in primes when i % j == 0).length
Или несколько более эффективно:(n) -> (p.push i for i in [2..n] when not (j for j in (p or p=[]) when i%j == 0)[0]) and n in p
(n) -> (p.push i for i in [2..n] when !(p or p=[]).some((j) -> i%j is 0)) and n in p
Бонус
Самая читаемая версияfizzbuzz
, которую вы когда-либо видели:
Ещё проще, но замудрённей, с небольшой подсказкой от satyr:"#{if i%3 is 0 then 'fizz' else ''}#{if i%5 is 0 then 'buzz' else ''}" or i for i in [1..100]
['fizz' unless i%3] + ['buzz' unless i%5] or i for i in [1..100]
»
Автор: Ricardo Tomasi
F#
В духе of 10 "10 однострочников на Scala, чтобы произвести впечатление на ваших друзей" вот некоторые однострочники на F#:
Удваивание всех чисел в списке
Тут всё просто, у F# тоже естьmap
:[1 .. 4] |> Seq.map (fun x -> x * x);;
Сумма списка чисел
Это так же просто, так как у F# есть ещёsum
:[1 .. 4] |> Seq.sum;;
Проверка вхождения подстроки
И это просто, ведь у нас естьfind
:["f#"; "scala"] |> Seq.find(fun w -> "this tweet contains f#".Contains(w));;
Чтение файла (скуууучно!)
У F# есть все библиотеки. NET. Очень легко прочесть все строки файла как последовательность:File.ReadLines(@"file.txt") |> Seq.map(fun l -> l.Length) |> Seq.sum;;
С днём рожденья!
Тоже скучно… вот так:[1 .. 4] |> Seq.map (fun i -> "Happy Birthday " + (if i = 3 then "dear NAME" else "to you")) |> Seq.iter Console.WriteLine;;
Фильтрация (на самом деле, разделение) списков
С использованием строенной функцииpartition
, мы легко можем разделить список:[49; 58; 76; 82; 88; 90] |> List.partition (fun i -> i > 60);;
Получение и парсинг XML
Опять же, пригодятся библиотеки .NET. К сожалению, это не совсем однострочник в F#. Но Дон Сайм показывает, как это сделать синхронно и асинхронно.
Поиск максимума и минимума в списке
Для этого в F# сеть строенные функции:[49; 58; 76; 82; 88; 90] |> Seq.min;; [49; 58; 76; 82; 88; 90] |> Seq.max;;
Параллельная обработка
Это пример от J Rocha. Предположим, у нас есть метод «isprime», и мы хотим получить количество простых чисел, сгруппированных по их последней цифре, от 1 до 50000. PSeq обрабатывает последовательности параллельно:[|1 .. 50000|] |> PSeq.filter isprime |> PSeq.groupBy (fun i -> i % 10) |> PSeq.map (fun (k, vs) -> (k, Seq.length vs)) |> Seq.toArray |> Seq.sort |> Seq.toList;;
Автор: Will Fitzgerald
Ruby
Был опубликован список из 10 однострочных примеров, которые призваны показать выразительность Scala. Версия CoffeeScript появились быстро, так что я думал, что опубликовал Ruby-версию один. Я считаю, что синтаксис Ruby немного чище, чем Scala, но в сущности (по крайней мере, насколько показывают эти примеры) относительно аналогичный.
Удвоение всех чисел в списке
(1..10).map { |n| n * 2 }
Сумма списка чисел
Или используя (встроенный) синтаксис(1..1000).inject { |sum, n| sum + n }
Symbol#to_proc
, который стал доступен, начиная с версии Ruby 1.8.7:
Или даже так:(1..1000).inject(&:+)
(1..1000).inject(:+)
Проверка вхождения подстроки
words = ["scala", "akka", "play framework", "sbt", "typesafe"] tweet = "This is an example tweet talking about scala and sbt." words.any? { |word| tweet.include?(word) }
Чтение файлов
Последнее включает в себя "\n" в конце каждого элемента массива, который может быть отделён путем добавленияfile_text = File.read("data.txt") file_lines = File.readlines("data.txt")
.map { |str| str.chop }
или с использованием альтернативной версии:File.read("data.txt").split(/\n/)
С днём рожденья
4.times { |n| puts "Happy Birthday #{n==2 ? "dear Tony" : "to You"}" }
Фильтрация списка чисел
[49, 58, 76, 82, 88, 90].partition { |n| n > 60 }
Получение и разбор XML от веб-сервиса
В этом примере требуются open-uri и hpricot или эквивалентные библиотеки, (вы можно использовать встроенную). Это не слишком много кода, но Скала явно выигрывает здесь.require 'open-uri' require 'hpricot' results = Hpricot(open("http://search.twitter.com/search.atom?&q=scala"))
Поиск минимума (или максимума) в списке
[14, 35, -7, 46, 98].min [14, 35, -7, 46, 98].max
Параллельная обработка
В отличие от Scala, поддержка многоядерности не встроена. Этот пример требует parallel или аналогичный gem.require 'parallel' Parallel.map(lots_of_data) do |chunk| heavy_computation(chunk) end
Решето эратосфена
Однострочник на Scala очень заумный, но совершенно нечитаемый. Простая реализация, требующая более чем одной строки, на Ruby:
Этот пример со StackOverflow.index = 0 while primes[index]**2 <= primes.last prime = primes[index] primes = primes.select { |x| x == prime || x % prime != 0 } index += 1 end p primes
Оригинальный пост: «10 Ruby One Liners to Impress Your Friends»
Автор: Antonio Cangiano
Clojure
Я увидел интересный пост сегодня под названием "10 однострочников на Scala, чтобы произвести впечатление на ваших друзей", а затем кто-то опубликовал в другом блоге пост под названием "10 однострочников на CoffeeScript, чтобы произвести впечатление на ваших друзей". Эти два поста показывают небольшие задачки (большинство из них имеют тривиальные решения в современных языках программирования), каждая их которых выполнены в примерно 1 строку кода.
Я думаю будем уместно сделать тоже самое для моего любимого языка программирования — Clojure.
Удваивание всех чисел в списке
(map #(* % 2) (range 1 11))
Сумма списка чисел
(reduce + (range 1 1001))
Проверка вхождения подстроки
Я считаю правильным использовать здесь регулярные выражения:
Как подсказали комментаторы, эта проблема может быть решена без использования регулярных выражений за счет использования множеств Clojure.(def tweet "This is an example tweet talking about clojure and emacs.") (def regex (re-pattern (apply str (interpose "|" ["clojure" "logic" "compojure" "emacs" "macros"])))) (re-seq regex tweet) ; Возвращает сами совпадения, а не true/false
(def tweet "This is an example tweet talking about clojure and emacs.") (def is-word? (set ["clojure" "logic" "compojure" "emacs" "macros"])) (not (nil? (some is-word? (.split tweet " ")))) ; Возвращает true/false
Чтение файла
Clojure Contrib будет считаться устаревшим в будущих релизах Clojure,(def file-text (slurp "data.txt")) ; Читает весь файл (def file-lines (clojure.contrib.io/read-lines "data.txt")) ; Читает последовательность строк
clojure.contrib.io/read-lines
можно записать в виде(line-seq (clojure.java.io/reader (clojure.java.io/file “data.txt”)))
в Clojure 1.3 и старше. Спасибо Aaron за указание на это.
С днём рожденья
Альтернативная версия:(doseq [l (map #(str "Happy Birthday " (if (= % 2) "dear Rich" "to You")) (range 4))] (println l))
(dotimes [n 4] (println "Happy Birthday " (if (= n 2) "dear Rich" "to You")))
Фильтрация списка чисел
(partition-by #(> % 60) [49 58 76 82 88 90])
Получение и парсинг XML от веб-сервиса
(clojure.xml/parse "http://search.twitter.com/search.atom?&q=clojure")
Поиск минимума и максимума в списке
(reduce max [14 35 -7 46 98]) (reduce min [14 35 -7 46 98]) ;; И теперь оба сразу ((juxt #(reduce max %) #(reduce min %)) [14 35 -7 46 98]) ; Возвращает [98 -7]
Параллельная обработка
;; Предположим, что process-line - это интенсивно использующая процессор функция, оперирующая со строками (pmap process-line lines) ; Обратите внимание на "p" перед map
Решето Эратосфена
Я не достаточно хорош (с точки зрения производительности и красоты) для однострочного решения «Решета Эратосфена». Я рекомендую проверить труд Кристофа Гранда на эту тему под названием «Все любят Решето Эратосфена» для решения этой проблемы.
Решение FizzBuzz
(map #(cond (zero? (mod % 15)) "FizzBuzz" (zero? (mod % 3)) "Fizz" (zero? (mod % 5)) "Buzz" :else %) (range 1 101))
Автор: Baishampayan
Python
После 10 удивительных однострочников на Scala/Ruby/Clojure/CoffeeScript, я подумал, что будет интересно сделать тоже самое на Python.
Без особого шума… поехали. Обратите внимание, что объявления переменных и импорты в отдельных строки по мере необходимости. Также каждая строка написана так, чтобы выводить результат на стандартный вывод для быстрой проверки.
Этот пост, возможно, один из самых быстрых, что я писал.
Удваивание всех чисел в списке
print map(lambda x: x * 2, range(1,11))
Сумма списка чисел
print sum(range(1,1001))
Проверка вхождения подстроки
wordlist = ["scala", "akka", "play framework", "sbt", "typesafe"] tweet = "This is an example tweet talking about scala and sbt." print map(lambda x: x in tweet.split(),wordlist)
Чтение файла
print open("ten_one_liners.py").readlines()
С днём рожденья
print map(lambda x: "Happy Birthday to " + ("you" if x != 2 else "dear Name"),range(4))
Фильтрация списка чисел
print reduce(lambda(a,b),c: (a+[c],b) if c > 60 else (a,b + [c]), [49, 58, 76, 82, 88, 90],([],[]))
Получение и разбор XML от веб-сервиса
from xml.dom.minidom import parse, parseString import urllib2 # note - i convert it back into xml to pretty print it print parse(urllib2.urlopen("http://search.twitter.com/search.atom?&q=python")).toprettyxml(encoding="utf-8")
Поиск минимума и максимума в списке
print min([14, 35, -7, 46, 98]) print max([14, 35, -7, 46, 98])
Параллельная обработка
import multiprocessing import math print list(multiprocessing.Pool(processes=4).map(math.exp,range(1,11)))
Решето Эратосфена
n = 50 # Мы получим простые числа между 2 и 50 print sorted(set(range(2,n+1)).difference(set((p * f) for p in range(2,int(n**0.5) + 2) for f in range(2,(n/p)+1))))
Автор: Dhananjay Nene
C#
Удваивание всех чисел в списке
Print("Multiple each item in a list by 2", Enumerable.Range(1, 10).Select(i => i * 2));
Сумма списка чисел
Print("Sum a list of numbers", Enumerable.Range(1, 1000).Sum());
Проверка вхождения подстроки
var wordlist = new[] { "C#", "and stuff" }; var tweet = "This is an example tweet talking about C# and stuff"; Print("Verify if a word exists in string", wordlist.Any(word => tweet.IndexOf(word) > -1)); Print("Show matched words in string", wordlist.Where(word => tweet.IndexOf(word) > -1));
Чтение файла
Print("Read in a File", File.ReadAllBytes("oneliners.exe").Length);
С днём рожденья
Print("Happy Birthday", Enumerable.Range(1, 4).Select((i) => string.Format("Happy Birthday {0} ", i == 3 ? "dear NAME" : "to You")));
Фильтрация списка чисел
var passed = new List<int>(); var failed = new List<int>(); (from bucket in new[] { passed, failed } from i in new[] { 49, 58, 76, 82, 88, 90 } select new { bucket, i }).ToList().ForEach((tuple) => tuple.bucket.AddRange(Enumerable.Repeat(tuple, 1).Where((tup) => (tup.bucket == passed && tup.i > 60) || (tup.bucket == failed && tup.i <= 60)).Select((tup) => tup.i))); Print("Filter list of numbers >60", (IEnumerable<int>)passed); Print("Filter list of numbers <=60", (IEnumerable<int>)failed);
Получение и разбор XML от веб-сервиса
Print("Fetch and Parse an XML web service", XDocument.Load("http://search.twitter.com/search.atom?&q=scala"));
Поиск минимума и максимума в списке
Print("Find minimum in a list", Enumerable.Min(new[] { 14, 35, -7, 46, 98 })); Print("Find maximum in a list", Enumerable.Max(new[] { 14, 35, -7, 46, 98 }));
Параллельная обработка
Print("Parallel Processing", Enumerable.Range(1, 10).AsParallel().Select((i)=>i*2).AsEnumerable());
FizzBuzz
Print("Fizzbuzz", Enumerable.Range(1, 15).Select((i)=>i + (i%3==0?"fizz":"") + (i%5==0?"buzz":"")));
Автор: Richard Birkby
Haskell
Соледуя за мемом (scala, ruby, clojure, python, f#, coffeescript, c#).
Удваивание всех чисел в списке
map (*2) [1..10]
Сумма списка чисел
foldl (+) 0 [1..1000] -- или лучше sum [1..1000]
Проверка вхождения подстроки
import Data.List let wordlist = ["monad", "monoid", "Galois", "ghc", "SPJ"] let tweet = "This is an example tweet talking about SPJ interviewing with Galois" or $ map (flip isInfixOf tweet) wordlist -- или лучше any (flip isInfixOf tweet) wordlist
Чтение файла
fileText <- readFile "data.txt" let fileLines = lines fileText -- или лучше let fileLines = fmap lines $ readFile "data.txt"
С днём рожденья
mapM_ putStrLn ["Happy Birthday " ++ (if x == 3 then "dear NAME" else "to You") | x <- [1..4]]
Фильтрация списка чисел
let (passed, failed) = partition (>60) [49, 58, 76, 82, 88, 90]
Получение и разбор XML от веб-сервиса
Для этого примера нужны пакетыcurl
иxml
. Смотрите RWH для их установки.import Network.Curl import Text.XML.Light import Control.Monad let results = liftM parseXMLDoc $ liftM snd (curlGetString "http://search.twitter.com/search.atom?&q=haskell" []) -- или лучше Control.Applicative let results = parseXMLDoc . snd <$> curlGetString "http://search.twitter.com/search.atom?&q=haskell" []
Поиск минимума и максимума в списке
foldl1 min [14, 35, -7, 46, 98] foldl1 max [14, 35, -7, 46, 98] -- или лучше minimum [14, 35, -7, 46, 98] maximum [14, 35, -7, 46, 98]
Параллельная обработка
Для этого примера необходим пакетparallel
.
import Control.Parallel import Control.Parallel.Strategies parMap rseq (*2) [1..100]
Генерация простых чисел
let pgen (p:xs) = p : pgen [x|x <- xs, x `mod` p > 0] take 40 (pgen [2..])
Автор: Michael Fogus
А теперь ваши варианты,