Более распространенный шаблон функционального синтаксиса

#python #filter #functional-programming

#python #Фильтр #функциональное программирование

Вопрос:

В python я знаком с функциональным синтаксисом чего-то вроде:

 data = [{'Age': 10, 'Name': 'Greg'}, {'Age': 20, 'Name': 'Sarah'}]
filter(lambda item: item['Name'] == 'Greg', data)
 

И для filter него используется (приблизительный) синтаксис:

 filter(condition, element_list)
 

Какой наиболее распространенный функциональный синтаксис для этого? используя приведенное выше или перевернув его так, чтобы element_list или iterable было первым? Почему один метод предпочтительнее другого?

Комментарии:

1. Python — ужасный язык для изучения этих комбинаторов. GVR официально заявляет, что он ненавидит парадигму и пытался избежать помещения map / filter в основную библиотеку (и был счастлив reduce , что не менее полезный комбинатор потоков был переведен в никогда не используемый functools модуль). Вероятно, вы захотите либо изучить реальный функциональный язык (например, Haskell или OCaml), либо использовать что-то вроде Python или Rust, которые реализуют комбинаторы потоков менее неудобным способом.

2. @SilvioMayolo конечно — не могли бы вы показать пример того, как один из них будет делать map / filter ?

3. @SilvioMayolo также вы говорите, что Python ужасен, но тогда я, возможно, захочу его использовать — или в одном из них была опечатка?

4. Ой, ой! Я имел в виду Ruby (который очень похож на Python, но делает эту конкретную вещь намного лучше) или Rust (который практически заново изобретает большую часть современного ООП с нуля с помощью более современного функционального подхода)

5. Что касается синтаксиса, Фрэнк в основном опередил меня. В большинстве языков ООП вы хотите map , чтобы / filter были методами , а не автономными функциями. В чистых функциональных языках они имеют смысл как функции, потому что композиция функций дешева. Но сделать их автономными функциями в Python — значит навсегда отбросить их как низшую альтернативу пониманию списков в Python

Ответ №1:

В Java, Swift и даже JavaScript map и filter являются методами в списках. Вы бы написали

Например, Swift попросил бы вас написать:

 myList.filter { item in item["name"] == "Greg" }
 

Java заставит вас превратить ваш массив в поток, а затем к потоку будут применены различные операции сопоставления и фильтрации:

 myList.stream().forEach(item -> print(item))
 

[Мой синтаксис может быть немного неточным.]

Комментарии:

1. можно ли использовать Swift вне приложения для iPhone?