- 1
- 2
- 3
- 4
f :: [Int] -> [Int]
f [] = []
f [a] = []
f (a:b:lst) = b: f lst
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
f :: [Int] -> [Int]
f [] = []
f [a] = []
f (a:b:lst) = b: f lst
Как вытащить каждый второй элемент из массива.
bot 26.10.2019 01:22 # 0
aloorpro 21.04.2020 18:18 # 0
f = snd . unzip . filter (odd . fst) . zip [0,1..]
1024-- 21.04.2020 18:26 # +1
Вообще, нестрогость типизации JS в случае map/reduce/filter очень круто использована. Там, где хаскелешки делают zip-unzip, жсофаги просто передают лишний аргумент.
3.14159265 21.04.2020 18:30 # 0
aloorpro 21.04.2020 19:21 # +1
1024-- 21.04.2020 20:16 # −1
gost 21.04.2020 18:33 # 0
jojaxon 21.04.2020 19:21 # 0
xs.stride(2)
aloorpro 21.04.2020 19:24 # 0
jojaxon 21.04.2020 19:37 # 0
Rooster 22.04.2020 12:18 # 0
А в фортран помнишь?
guest8 22.04.2020 13:05 # −999
1024-- 21.04.2020 20:17 # −2
3.14159265 21.04.2020 21:08 # +2
Так отрицательный шаг реверсит спис массив
А отрицательные индексы начинают работать с конца.
Они не только обошли проблему out of range индексов, но и сделали дополнительный миллион полезных кейсов.
Гениальная находка.
guest8 21.04.2020 18:52 # −999
gost 21.04.2020 18:54 # 0
Зачем? Зачем?
3.14159265 21.04.2020 18:55 # +1
guest8 21.04.2020 18:58 # −999
gost 21.04.2020 18:58 # 0
guest8 21.04.2020 18:59 # −999
BECEHHuu_nemyx 21.04.2020 19:04 # 0
gostinho 21.04.2020 23:18 # 0
MAKAKA 28.08.2020 02:00 # 0
Desktop 21.04.2020 23:26 # 0
MAKAKA 22.04.2020 00:29 # 0
Desktop 22.04.2020 11:09 # 0
guest8 22.04.2020 11:19 # −999
Desktop 22.04.2020 11:50 # 0
Красивее пока не придумалось
Desktop 22.04.2020 11:56 # 0
guest8 22.04.2020 12:58 # −999
Desktop 22.04.2020 13:14 # 0
А что, в Котлине нет сахара для аргументов замыкания? Типа $0, $1, вот это всё. Вроде ж был
MAKAKA 22.04.2020 13:16 # 0
Сахар есть только для единственного аргумента (it). Если их два, то надо явно..
С руби стрижа роднит явное переключение в енумербл (collect): в коко этот метод есть и у Array, и у Iterable, то-есть практически у всех. Даже у sequence
Desktop 22.04.2020 13:23 # 0
Кстати, если не стоит задача преобразования, а только итерации, то лучше и более читаемой, чем функциональные варианты, мне кажется классика:
MAKAKA 22.04.2020 13:38 # 0
Берем первые 10 чисел, делящихся на 7.
коко
руби
в свифте можно?
1024-- 22.04.2020 13:46 # 0
Кобенация скобок для вызова с их отсутствием - говно.
Так же, как необязатяльность точки с запятой в JS - говно.
Круглые скобки, отсутствие скобок, ...
То ли дело Haskell совсем без скобок или C совсем со скобками.
guest8 22.04.2020 13:49 # −999
1024-- 22.04.2020 14:09 # 0
Я думал, это эквивалентно generateSequence(0)({ it + 1 })
В такой нотации код становится неподдерживаемым. Было где-то f(x) + 1 и g { it+1 }. "f(x)" решили подставить вместо g. Вышло f(x) { it + 1 }, в f передали 2 аргумента.
Вообще, для языка, который предполагает использование отдельных конструкций ФП, язык сильно дубовый. Какие-то лямбды, какие-то proc, непродуманность касательно работы с каррированными функциями (f(0) { it + 1 } != f(0) ({ it + 1 })).
Как будто автор начал читать учебник по ФП, сделал так, чтобы работали примеры с рисунков 1, 2, 4, 7, и закрыл учебник. Или как будто хотел написать этот язык на другом (как я писал JS на C++, и у меня console.log и console["log"] работает, можно сделать console["xxx"] = 1, но если сделать console.xxx = 1, то не скомпилируется.
guest8 22.04.2020 14:13 # −999
1024-- 22.04.2020 14:16 # 0
Desktop 22.04.2020 13:49 # 0
MAKAKA 22.04.2020 13:53 # 0
Rooster 22.04.2020 13:58 # 0
MAKAKA 22.04.2020 13:59 # 0
Rooster 22.04.2020 14:03 # +1
Значит бесконечные последовательности не нужны.
MAKAKA 22.04.2020 14:04 # 0
Rooster 22.04.2020 14:12 # 0
guest8 22.04.2020 14:19 # −999
Rooster 22.04.2020 14:28 # 0
Приведи реальный пример где нужны.
MAKAKA 22.04.2020 14:31 # 0
Rooster 22.04.2020 14:39 # +1
* сгенерируйте 1005001 чисел кратных 7 и нигде не используйте.
Реальный пример.
gost 22.04.2020 14:52 # 0
1024-- 22.04.2020 14:58 # 0
Какая-то питушня для ма-те-ма-ти-ков из раш-ки.
Ма-те-ма-ти-ка пригодится, если понадобится найти
1. 10 чисел, у которых i % 7 == 2
2. 10 чисел, у которых (i % 7) + (i % 10 / 2) == 6
Rooster 22.04.2020 15:30 # 0
А со вторым сложнее, там думать надо, а я не умею.
BECEHHuu_nemyx 22.04.2020 16:02 # 0
Rooster 22.04.2020 17:13 # 0
Хотя как жс-питушок он бы написал "===", может это какой-то "Си", тагда целый.
Хуй ево знаит.
BECEHHuu_nemyx 22.04.2020 18:21 # 0
Пусть питух плавающий. Тогда:
2*(i % 7) + (i % 10) == 12.
(i % 7) принимает 7 значений, (i % 10) принимает 10 значений.
Поскольку 2*(i % 7) чётное, то и (i % 10) должно быть чётным, иначе 12 не получим. Значит, для (i % 10) остаются 6 значений.
Получаем:
(x | x in {0, 2, 4, 6, 8, 10, 12}) + (y | y in {0, 2, 4, 6, 8}) = 12.
Из этих кобенаций 12 получим в таких случаях: 4 + 8; 6 + 6; 8 + 4; 10 + 2; 12 + 0. Итого пять вариантов:
1) i % 7 == 2; i % 10 == 8.
2) i % 7 == 3; i % 10 == 6.
3) i % 7 == 4; i % 10 == 4.
4) i % 7 == 5; i % 10 == 2.
5) i % 7 == 6; i % 10 == 0.
Каждое из таких чисел можно представить как 70*k плюс хвост, который меньше 70. Осталось найти значения таких хвостов.
Для первого варианта: 7*m + 2 == 10*n + 8; 7*m - 10*n = 6. Очевидное решение 7*8 + 2 = 10*5 + 8. Хвост равен 58.
Следующее решение (7*18 + 2 = 10*12 + 8) оказывается больше 70.
Для второго варианта: 7*m + 3 == 10*n + 6; 7*m - 10*n = 3.
Очевидное решение 7*9 + 3 = 10*6 + 6. Хвост равен 66.
Для третьего варианта: 7*m + 4 == 10*n + 4; 7*m - 10*n = 0.
Очевидное решение 7*0 = 0*7. Хвост равен 0.
Для четвёртого варианта: 7*m + 5 == 10*n + 2; 7*m - 10*n = -3.
Очевидное решение 7*1 + 5 = 10*1 + 2. Хвост равен 12.
Для пятого варианта: 7*m + 6 == 10*n ; 7*m - 10*n = -6.
Очевидное решение 7*2 + 6 = 10*2. Хвост равен 20.
Итого: окончательным решением будет последовательность чисел вида 70*k + числа из набора {58; 66; 0; 12; 20}.
gost 22.04.2020 18:31 # +1
1024-- 22.04.2020 18:23 # +1
"===" пишут сишники под прикрытием!
BECEHHuu_nemyx 22.04.2020 18:28 # 0
Какой-то форумный движок принимал неправильные пароли из-за «слабого» сравнения.
1024-- 22.04.2020 18:35 # +1
null и undefined равны только между собой и больше не с чем. Если null пришёл из базы и его кастанули к String, всё равно имеем сравнение hash(received_password) == String(null).
Если каст и сравнение с null сработали, то проблема не в "==", а в хранении паролей в БД.
Ну хотя не знаю, как ещё в JS можно сравнить плохие пароли.
BECEHHuu_nemyx 22.04.2020 18:52 # 0
1024-- 22.04.2020 19:07 # 0
https://www.ecma-international.org/ecma-262/10.0/index.html#sec-abstract-equality-comparison
Если число является одним из операндов, то второй операнд скастуется в число. Но это не будет как scanf(s, "%f", постфикс не откидывается и зананивает число.
* если число зананено, то оно ни с чем не сравнится. Разве что если автор - питушок и использует !(received != send) для сравнения.
* если число не зананено, то возможна питушня вроде 1 == '1', 1 == '1.0', 1 == '1.00e+00' но не 1 == '1bagor'
Однако, ещё где-то надо достать число. От пользователя по умолчанию приходит строка, какая-нибудь SQLушня типизирована, там тоже должна быть строка.
1024-- 22.04.2020 18:21 # 0
Но если надо определиться, то пусть будет целочисленное. "%" и "/" с плавающими питухами в одном выражении - какая-то мерзкая опасная питушня.
BECEHHuu_nemyx 22.04.2020 18:26 # 0
При плавающем делении 2/2 == 1; 3/2 == 1.5, тройка оказывается недопустимым значением (i % 10), потому что 6 не получим.
При целочисленным делении 2/2 == 1 и 3/2 тоже равно 1, поэтому тройка в качестве возможного значения (i % 10) не отсекается.
1024-- 22.04.2020 18:37 # 0
Вот зачем Вы эти решения случайной кобенации чисел и опереций нагенерировали?
> 1) i % 7 == 2; i % 10 == 8.
> 2) i % 7 == 3; i % 10 == 6.
> 3) i % 7 == 4; i % 10 == 4.
> 4) i % 7 == 5; i % 10 == 2.
> 5) i % 7 == 6; i % 10 == 0.
gost 22.04.2020 18:46 # +1
1024-- 22.04.2020 18:53 # 0
Вот когда программу обкатают и на практике будут вычислять хотя бы сотни тысяч таких чисел - тогда и вызывайте своих императоров из царских палат шестых.
gost 22.04.2020 18:55 # 0
jojaxon 22.04.2020 18:57 # 0
gost 22.04.2020 18:58 # 0
1024-- 22.04.2020 19:11 # 0
gost 22.04.2020 19:14 # 0
jojaxon 22.04.2020 19:14 # +1
jojaxon 22.04.2020 19:15 # 0
jojaxon 22.04.2020 18:55 # 0
gost 22.04.2020 18:32 # 0
>>> Если целочисленное, то решений может получиться раза в два больше
Именно поэтому я за «Раш-ку» и её «ма-те-ма-ти-ков».
gostinho 22.04.2020 14:05 # 0
MAKAKA 22.04.2020 14:05 # 0
зы: у пидона нету спеки, так что делать его трансляторы во что либо может быть не безопасно
gostinho 22.04.2020 14:42 # 0
Rooster 22.04.2020 14:46 # 0
На планшете?
gostinho 22.04.2020 19:34 # 0
DypHuu_niBEHb 22.04.2020 22:23 # +1
Следование ставит список на обсуждение вниз с всех Кодов 7-BIT ASCII и их соответствующих Кодов реальности HTML.
Если вы хотите увидеть соответствующий НАГОВОР, то ОКТЯБРЬ и расширенный комплект Кодов ASCII тогда проверяют следующую главу.
https://www.tutorialspoint.com/ru/html/html_ascii_codes.htm
KOPOHABuPYC 23.04.2020 00:19 # 0
jojaxon 22.04.2020 19:07 # 0
Rooster 22.04.2020 14:13 # 0
gostinho 22.04.2020 14:43 # 0
Rooster 22.04.2020 14:45 # 0
gostinho 22.04.2020 19:33 # 0
Desktop 22.04.2020 14:05 # 0
Только я не понимаю, как работает твой пример. Дока говорит, что
Returns a sequence which invokes the function to calculate the next value on each iteration until the function returns null.
У тебя функция никогда не вернёт null. Когда же тогда вообще в принципе вызовется filter?
MAKAKA 22.04.2020 14:10 # 0
take(10) дергает фильтр
фильтр дергаетgenerateSequence, пока та не вернет ему 10 значений, которые фильтр устроят
в итоге получается ленивый комбайн, который выдергивает первые 10 чисел по условию.
провреь
https://play.kotlinlang.org/
Desktop 22.04.2020 14:23 # 0
Как фильтр может дёргать generateSequence? Фильтр должен работать по коллекции. generateSequence работает как reduce и на каждом шаге пересоздаёт коллекцию с +1 элементом? В какой код под капотом это всё в итоге разворачивается?
guest8 22.04.2020 14:25 # −999
Desktop 22.04.2020 14:56 # 0
https://github.com/JetBrains/kotlin/blob/61ad32f012789ef95376ba30812c32e779c4806b/libraries/stdlib/src/kotlin/collections/Sequences.kt#L538
Как я и догадывался, под капотом доморощенный генератор.
Ну, его на Свифте, судя по всему, придётся писать руками (или надо ковырять стандартную библиотеку). В остальном подход схож:
Desktop 22.04.2020 15:06 # 0
Desktop 22.04.2020 14:25 # 0
jojaxon 22.04.2020 17:36 # 0
iota(1,100500).filter!"a%7==0".take(10)
лямбды короче чем в плюсовом бусте
Rooster 22.04.2020 17:51 # −1
bormand 22.04.2020 17:52 # 0
Desktop 22.04.2020 18:02 # 0
Выйди и зайди нормально.
1024-- 22.04.2020 18:26 # 0
Она преобразуется в какой-то код вида LamEq(LamMod(LamVar(1),7),0) (вроде как пользовательских литералов в крестах)?
Она интерпретируется?
bormand 22.04.2020 18:27 # 0
В ди хитро сделано. Там вместо макросов и шаблонов ты просто отдаёшь строку конпелятору. И он её конпелирует как обычный код, как-будто бы он на этом месте и был написан.
1024-- 22.04.2020 18:38 # 0
Desktop 22.04.2020 18:39 # 0
https://dlang.org/phobos/std_algorithm_iteration.html#.filter
Если посмотреть на примеры в доке, то строка ему, в общем-то, и не нужна. Без глубокого знания D сложно понять, зачем использовать строковый литерал в примере хохахона.
jojaxon 22.04.2020 18:46 # +1
gost 22.04.2020 18:48 # 0
jojaxon 22.04.2020 18:50 # 0
Desktop 22.04.2020 19:00 # 0
Давай ещё про D. Например, про template mixins.
bormand 22.04.2020 17:24 # +1
З.Ы. Вы там упоролись фильтровать числа, делящиеся на 7?
Rooster 22.04.2020 17:30 # −1
Кок!
guest8 22.04.2020 17:33 # −999
bormand 22.04.2020 17:34 # +1
take 10 [0, 7*16 ...]
Очевидно же.
guest8 22.04.2020 17:36 # −999
bormand 22.04.2020 17:43 # 0
guest8 22.04.2020 17:44 # −999
bormand 22.04.2020 17:46 # 0
MAKAKA 22.04.2020 17:51 # 0
Desktop 22.04.2020 19:01 # +1
- мимокрод
gost 22.04.2020 19:03 # +1
1024-- 22.04.2020 18:29 # 0
bormand 22.04.2020 18:31 # +1
merge xs [] = xs
merge [] ys = []
merge (x:xs) (y:ys) guard x < y = x : merge xs (y:ys)
merge (x:xs) (y:ys) guard x > y = y : merge (x:xs) ys
merge (x:xs) (y:ys) = x : merge ys ys
1024-- 22.04.2020 18:42 # 0
Ма-те-ма-тик из раш-ки!
1024-- 22.04.2020 13:43 # 0
Но как работать с замыканиями в $0-питушне? Как доставать питушню из внешних скоупов?
Например, как достали "a" в λa.λb.a+b
Для этого делают удобный сахарок?
Desktop 22.04.2020 13:56 # 0
Как во внутреннем замыкании захватить что-то из внешнего?
1024-- 22.04.2020 14:13 # 0
Когда лямбда внутри лямбды, её $0, $1 скрывают внешние $0, $1. Неясно, как достать внешние.
Насколько я понимаю, λa.λb.a+b должно выглядеть как {{$0+$0}} :)
Desktop 22.04.2020 14:13 # 0
Если ты про то, можно ли как-то захватить сахарок в коде типа
,
чтобы внешний $0 был доступен во внутреннем замыкании, то думаю, что нет. Надо писать явно.
1024-- 22.04.2020 14:18 # 0
А для явности есть что-то, или надо создавать "настоящую" функцию с именем и прочим?
Desktop 22.04.2020 14:27 # 0
1024-- 22.04.2020 14:29 # 0
aloorpro 21.04.2020 19:20 # 0
1024-- 21.04.2020 20:25 # 0
Должна быть какая-то загадочность лямбды? Лямбды - это ФП, возведённое в абсолют. Лямбда фундаментальна, её не волнует, что кто-то там думает об обычности.
> зачем перебирать все элементы массива, если он не рекурсивный тип данных
Что за питушня? Если речь про ленивость, то причём тут рекурсивные типы? Если не про ленивость, то не перебрать все элементы нельзя.
aloorpro 22.04.2020 01:36 # 0
Лямбды это мейнстрим, скучный и посредственный.
Равно как и мой пример, я его привел в ответ к комменту про полторы строчки.
Но зачем всюду пихать свой жээс? Тебе он нравится, хорошо, сядь, выдохни, успокойся и расслабься. Продолжай называть костыли в его устройстве крутой реализацией полезных фич.
Что за питушня, разберешься самостоятельно, если повезет. Ты, судя по всему, организм юный и особыми знаниями не обремененный, так что есть куда расти.
1024-- 22.04.2020 11:18 # 0
Скучные, слышите? Бесточечному царю не нравятся лямбды. Ребята, чистим код от лямбд. Чтоб сука к 12 сентября - к 120летию Вождя - было чисто!
> Продолжай называть костыли в его устройстве крутой реализацией полезных фич.
"костыли" позволили встроить в язык полиморфные функции, повышающие выразительность.
> Что за питушня, разберешься самостоятельно, если повезет.
"Ко-ко-ко, я сам не знаю, что высрал, но вставлю какую-нибудь хрень в стиле великого учителя Хуй-Цзы"
Технологию гиперссылок бесточечные цари в силу большой занятостью зачисткою мира от лямбд не осилили.
guest8 22.04.2020 11:22 # −999
guestinxo 26.10.2019 01:27 # 0
bat 26.10.2019 06:20 # 0
https://ideone.com/D3cVIA
guestinxo 26.10.2019 10:48 # 0
aloorpro 21.04.2020 19:06 # 0
f (a:b:lst) = b: f lst
f _ = []
aloorpro 22.04.2020 01:46 # +1