- 1
- 2
- 3
- 4
- 5
- 6
- 7
only :: (Integral nt) => nt -> [Bool]
only n = [ x `mod` n == 0 | x <- [0..] ]
each :: (Integral nt) => nt -> [a] -> [a]
each n xs = [ snd x | x <- filter fst $ zip (only n) xs ]
main = do print $ each 2 [1,2,3,4,5,6,7,8,9]
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−82
only :: (Integral nt) => nt -> [Bool]
only n = [ x `mod` n == 0 | x <- [0..] ]
each :: (Integral nt) => nt -> [a] -> [a]
each n xs = [ snd x | x <- filter fst $ zip (only n) xs ]
main = do print $ each 2 [1,2,3,4,5,6,7,8,9]
Haskell. Получение каждого n-го элемента списка.
Если нет, прошу пояснить.
http://ideone.com/fo8esL
http://ideone.com/wXzfi8
Ниже исправил это кощунство:
http://govnokod.ru/12056#comment158782
Лол, что ты написал? Почему у тебя первый элемент списка считается энным?
http://ideone.com/2GtgDK
кэп намекает, что в списках хаскеля индексирование принято с 0
http://ideone.com/YpEGDB
почему не Где хвалёные навыки паттерн-матчинга
Нормально?
Ага, годнота.
http://ideone.com/bjbH3A
upd: вижу. Он не может узнать, что за тип у списка при передаче пустого.
each :: Int -> [a] -> [a] - не работает!
Получается нужно явно указывать тип "a" или при использовании писать (each 1 []) :: Type.
Криво.
Должно быть как-то так, но это не правильно скорее всего, поэтому ждем какого-нибудь Хацкелиста.
http://ideone.com/4vi9eJ
На самом деле, это не такая уж большая проблема, т.к. явно передавать пустой список мало кому нужно: обычно они возникают в процессе обработки, и его "тип" известен. не работает, т.к. print вызывает полиморфную функцию show, а для пустого списка непонятно, что вызывать. Поэтому нужно явно указывать тип пустого списка.
> в списках хаскеля индексирование принято с 0
Именно.
А т.к. 0 делится на n* априори, берётся и он.
* Исключая n = 0
Только что-то не компилится тоже:
http://ideone.com/lyFejA
each n xs = zipWith (!!) (repeat xs) [0, n.. len xs - 1]
Проблема была в том, что оператор !! применим только как (массив!!индекс), а он применялся как (значение_массива!!индекс).
Так что приходится делать repeat(xs) для получения списка. Но есть вариант получше:
http://ideone.com/Sc3KOY
Вот он чемпион читабельности!
Эка я протупил.
>Вот он чемпион читабельности!
И вот и ты уже не спишь... Хаскель не нужен)))
Только есть одна проблема. Этот чемпион не может в бесконечные списки, так что не вариант. Подозреваю, что и производительность из-за !! оставляет желать лучшего.
Пока это самый очевидный и самый правильный вариант, если сигнатурку типов поправить
Немного короче, более понятная в правой части и менее понятная в левой. Хотя кому-как.
Ага, не стало лучше...
С одной стороны читается лучше и запись короче, с другой стороны обосрут же если первый элемент через head получать, а не через патерн-матчинг.
upd: Кстати, есть мыло, аська, скайп для вопросов по ФП? Говнокод всё-таки не для этого.
each _ [] = []
Я уже выяснил, что можно не править. Проблема всё-таки в функции print которая не знает как вывести пустой список.
main = print [] -- Ошибка
Костыль же вроде?
upd: Хотя наверное ты прав.
upd2:Ты обновил пост. Инфа не актуальна.
Если надо больше, то придется делать всё самому.
Эти сказки можно рассказывать только ньюфагам, чтобы затащить в функциональщину.
На деле список очень даже конечный. Притом предсказть конец бесконечного списка весьма не просто. Ты никогда не можешь быть уверен наверняка, что для обработи данной задачи тебе хватит объёмов памяти.
А зачем? Все равно ты не будешь использовать весь этот список, а возьмешь для вывода\сохранения только нужную его часть.
На самом деле бесконечный список довольно удобная абстракция, сокращающая код - не надо писать отдельный случай для пустого списка. Я так писал Метод Наименьших Квадратов, который строит бесконечные вектора и матрицы, сводит к треугольному виду бесконечную систему уравнений, и выводит ответ нужной размерности... Если интересно - могу выложить.
Если же список бесконечен - то код упрощается:
2)Разворачивать стек, создавая новый конечный список, который в конце тоже дополнится жопами.
3) ...
4)PROFIT
Одна проблема: Когда мы создали первый [1], то он уже превращается в 1ницу с бесконечножопным хвостом, так что добавить следующий элемент списка уже не представляется возможным.
Ну и как бы вообще совершенно не понятна идея этой бесполезной бесконечножопной фичи
А зачем она в языке с повсеместной ленивостью?
MRef на список? - мутабильное говно.
Ещё варианты?
f x = let a = [1..] in ...
Вот тут a никто не держит кроме выражения, которое будет стоять на месте точек. Сборщик мусора отлично будет поедать этот список.
https://ideone.com/4hYzxf
В каком ещё языке есть такой?
так гоатсе же в перле
Только не придумал, что делать со словом is.
https://ideone.com/F0Rau0
Теперь надо сделать так, чтобы функция prolog прогоняла код с разными комбинациями переменных $foo, $bar, $baz, тогда удастся напечатать весь код.
Но мне страшно представить, на что будет нацелена точка входа.
https://en.wikipedia.org/wiki/Crt0
http://govnokod.ru/12144
http://govnokod.ru/12149
http://govnokod.ru/12173