- 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
Как вытащить каждый второй элемент из массива.
f = snd . unzip . filter (odd . fst) . zip [0,1..]
Вообще, нестрогость типизации JS в случае map/reduce/filter очень круто использована. Там, где хаскелешки делают zip-unzip, жсофаги просто передают лишний аргумент.
xs.stride(2)
А в фортран помнишь?
Так отрицательный шаг реверсит спис массив
А отрицательные индексы начинают работать с конца.
Они не только обошли проблему out of range индексов, но и сделали дополнительный миллион полезных кейсов.
Гениальная находка.
Зачем? Зачем?
Красивее пока не придумалось
А что, в Котлине нет сахара для аргументов замыкания? Типа $0, $1, вот это всё. Вроде ж был
Сахар есть только для единственного аргумента (it). Если их два, то надо явно..
С руби стрижа роднит явное переключение в енумербл (collect): в коко этот метод есть и у Array, и у Iterable, то-есть практически у всех. Даже у sequence
Кстати, если не стоит задача преобразования, а только итерации, то лучше и более читаемой, чем функциональные варианты, мне кажется классика:
Берем первые 10 чисел, делящихся на 7.
коко
руби
в свифте можно?
Кобенация скобок для вызова с их отсутствием - говно.
Так же, как необязатяльность точки с запятой в JS - говно.
Круглые скобки, отсутствие скобок, ...
То ли дело Haskell совсем без скобок или C совсем со скобками.
Я думал, это эквивалентно 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, то не скомпилируется.
Значит бесконечные последовательности не нужны.
Приведи реальный пример где нужны.
* сгенерируйте 1005001 чисел кратных 7 и нигде не используйте.
Реальный пример.
Какая-то питушня для ма-те-ма-ти-ков из раш-ки.
Ма-те-ма-ти-ка пригодится, если понадобится найти
1. 10 чисел, у которых i % 7 == 2
2. 10 чисел, у которых (i % 7) + (i % 10 / 2) == 6
А со вторым сложнее, там думать надо, а я не умею.
Хотя как жс-питушок он бы написал "===", может это какой-то "Си", тагда целый.
Хуй ево знаит.
Пусть питух плавающий. Тогда:
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}.
"===" пишут сишники под прикрытием!
Какой-то форумный движок принимал неправильные пароли из-за «слабого» сравнения.
null и undefined равны только между собой и больше не с чем. Если null пришёл из базы и его кастанули к String, всё равно имеем сравнение hash(received_password) == String(null).
Если каст и сравнение с null сработали, то проблема не в "==", а в хранении паролей в БД.
Ну хотя не знаю, как ещё в JS можно сравнить плохие пароли.
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ушня типизирована, там тоже должна быть строка.
Но если надо определиться, то пусть будет целочисленное. "%" и "/" с плавающими питухами в одном выражении - какая-то мерзкая опасная питушня.
При плавающем делении 2/2 == 1; 3/2 == 1.5, тройка оказывается недопустимым значением (i % 10), потому что 6 не получим.
При целочисленным делении 2/2 == 1 и 3/2 тоже равно 1, поэтому тройка в качестве возможного значения (i % 10) не отсекается.
Вот зачем Вы эти решения случайной кобенации чисел и опереций нагенерировали?
> 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.
Вот когда программу обкатают и на практике будут вычислять хотя бы сотни тысяч таких чисел - тогда и вызывайте своих императоров из царских палат шестых.
>>> Если целочисленное, то решений может получиться раза в два больше
Именно поэтому я за «Раш-ку» и её «ма-те-ма-ти-ков».
зы: у пидона нету спеки, так что делать его трансляторы во что либо может быть не безопасно
На планшете?
Следование ставит список на обсуждение вниз с всех Кодов 7-BIT ASCII и их соответствующих Кодов реальности HTML.
Если вы хотите увидеть соответствующий НАГОВОР, то ОКТЯБРЬ и расширенный комплект Кодов ASCII тогда проверяют следующую главу.
https://www.tutorialspoint.com/ru/html/html_ascii_codes.htm
Только я не понимаю, как работает твой пример. Дока говорит, что
Returns a sequence which invokes the function to calculate the next value on each iteration until the function returns null.
У тебя функция никогда не вернёт null. Когда же тогда вообще в принципе вызовется filter?
take(10) дергает фильтр
фильтр дергаетgenerateSequence, пока та не вернет ему 10 значений, которые фильтр устроят
в итоге получается ленивый комбайн, который выдергивает первые 10 чисел по условию.
провреь
https://play.kotlinlang.org/
Как фильтр может дёргать generateSequence? Фильтр должен работать по коллекции. generateSequence работает как reduce и на каждом шаге пересоздаёт коллекцию с +1 элементом? В какой код под капотом это всё в итоге разворачивается?
https://github.com/JetBrains/kotlin/blob/61ad32f012789ef95376ba30812c32e779c4806b/libraries/stdlib/src/kotlin/collections/Sequences.kt#L538
Как я и догадывался, под капотом доморощенный генератор.
Ну, его на Свифте, судя по всему, придётся писать руками (или надо ковырять стандартную библиотеку). В остальном подход схож:
iota(1,100500).filter!"a%7==0".take(10)
лямбды короче чем в плюсовом бусте
Выйди и зайди нормально.
Она преобразуется в какой-то код вида LamEq(LamMod(LamVar(1),7),0) (вроде как пользовательских литералов в крестах)?
Она интерпретируется?
В ди хитро сделано. Там вместо макросов и шаблонов ты просто отдаёшь строку конпелятору. И он её конпелирует как обычный код, как-будто бы он на этом месте и был написан.
https://dlang.org/phobos/std_algorithm_iteration.html#.filter
Если посмотреть на примеры в доке, то строка ему, в общем-то, и не нужна. Без глубокого знания D сложно понять, зачем использовать строковый литерал в примере хохахона.
Давай ещё про D. Например, про template mixins.
З.Ы. Вы там упоролись фильтровать числа, делящиеся на 7?
Кок!
take 10 [0, 7*16 ...]
Очевидно же.
- мимокрод
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
Ма-те-ма-тик из раш-ки!
Но как работать с замыканиями в $0-питушне? Как доставать питушню из внешних скоупов?
Например, как достали "a" в λa.λb.a+b
Для этого делают удобный сахарок?
Как во внутреннем замыкании захватить что-то из внешнего?
Когда лямбда внутри лямбды, её $0, $1 скрывают внешние $0, $1. Неясно, как достать внешние.
Насколько я понимаю, λa.λb.a+b должно выглядеть как {{$0+$0}} :)
Если ты про то, можно ли как-то захватить сахарок в коде типа
,
чтобы внешний $0 был доступен во внутреннем замыкании, то думаю, что нет. Надо писать явно.
А для явности есть что-то, или надо создавать "настоящую" функцию с именем и прочим?
Должна быть какая-то загадочность лямбды? Лямбды - это ФП, возведённое в абсолют. Лямбда фундаментальна, её не волнует, что кто-то там думает об обычности.
> зачем перебирать все элементы массива, если он не рекурсивный тип данных
Что за питушня? Если речь про ленивость, то причём тут рекурсивные типы? Если не про ленивость, то не перебрать все элементы нельзя.
Лямбды это мейнстрим, скучный и посредственный.
Равно как и мой пример, я его привел в ответ к комменту про полторы строчки.
Но зачем всюду пихать свой жээс? Тебе он нравится, хорошо, сядь, выдохни, успокойся и расслабься. Продолжай называть костыли в его устройстве крутой реализацией полезных фич.
Что за питушня, разберешься самостоятельно, если повезет. Ты, судя по всему, организм юный и особыми знаниями не обремененный, так что есть куда расти.
Скучные, слышите? Бесточечному царю не нравятся лямбды. Ребята, чистим код от лямбд. Чтоб сука к 12 сентября - к 120летию Вождя - было чисто!
> Продолжай называть костыли в его устройстве крутой реализацией полезных фич.
"костыли" позволили встроить в язык полиморфные функции, повышающие выразительность.
> Что за питушня, разберешься самостоятельно, если повезет.
"Ко-ко-ко, я сам не знаю, что высрал, но вставлю какую-нибудь хрень в стиле великого учителя Хуй-Цзы"
Технологию гиперссылок бесточечные цари в силу большой занятостью зачисткою мира от лямбд не осилили.
https://ideone.com/D3cVIA
f (a:b:lst) = b: f lst
f _ = []