Чисто функциональное программирование на Android

Есть ли какие-либо улучшения в этой области? Я хочу, чтобы иметь возможность писать чисто функциональный код на Android в Haskell или подобных языках. Я пробовал несколько примеров с Scala, но, похоже, это боль, чтобы начать. Существуют ли какие-либо другие функциональные языки JVM, которые я могу использовать для написания приложений Android?

Изменить: функциональные языки, которые записывают собственные приложения для Android. Моя ошибка в JVM.

Ответ 1

Я сомневаюсь, что вы можете найти что-нибудь зрелое для написания Haskell-подобного кода для Android. Вам нужно реализовать Java-абстракции, которые требуются API Android (реализовать активность и т.д.).

Но если вы действительно хотите писать для Android в чисто функциональном стиле, вы можете попытаться реализовать свою бизнес-логику на чистом функциональном языке, который компилируется в JVM и вызывает его из ваших классов Java. Этот подход был бы намного проще, чем пытаться полностью реализовать его в чисто функциональном стиле.

Как ваш выбор языка, вы можете попробовать

  • Frege, у него даже есть библиотека для Android - froid

  • Eta lang, это очень новый и, вероятно, никто не пытался использовать его для Android еще

Ответ 2

Мне нужно безболезненное решение с точки зрения Gradle сборок и т.д., у вас есть только два варианта: Java и Kotlin, из которых, конечно же, вы должны выбрать Kotlin;)

Kotlin имеет большинство вещей, которые вам нужно написать в функциональном стиле:

  • функционирует как гражданин первого класса
  • функции более высокого порядка
  • неизменяемые коллекции
  • var и val как в Scala
  • if-else как оператор
  • элементы сопоставления шаблонов (where)
  • хвостовая рекурсия
  • и многое другое...

Если вы также включили funKTionale и kotlinx.collections.immutable, у вас будут все функциональные свойства, такие как: Option, Try, каррирование, memoization, постоянные структуры данных и т.д....

Чтобы начать с Kotlin, установите последнюю версию Android Studio 3 Preview, которая уже имеет встроенный Kotlin поддержка.

BTW, не настолько поляризованы в "чистый" функционал;) В конце концов, 100% "чистый" означает отсутствие побочных эффектов, что означает, что ваше приложение не может взаимодействовать с пользователем;)

Надеюсь, что это поможет:)

Ответ 3

Я никогда не пробовал это лично, но вы можете программировать F #, используя Xamarin.Android(и, я полагаю, с Xamarin Forms тоже). Вы можете увидеть руководство здесь. (Он также содержит пример кода).

Как некоторый фон, F # является функциональным языком .NET Framework. Он получен из ML; на самом деле, многие сценарии ML могут быть скомпилированы почти "напрямую" как F # (с оговоркой, что вам, возможно, придется переименовать, поскольку F # имеет некоторые дополнительные ключевые слова, которые ML не имеет, чтобы поддерживать несколько расширений .NET).

Xamarin позволяет разрабатывать приложения для Android, iOS и Windows. Xamarin Forms позволяет использовать единую кодовую базу для всех трех платформ (это конкурент Ionic).

Еще один момент: Android не использует JVM, даже если вы пишете приложения на Java. (На самом деле, Android еще не поддерживает все функции Java 8). Через Android 4.4 он использовал Dalvik; после этого он начал использовать Android Runtime.

Вы также можете попробовать использовать язык JVM, например Scala, для создания JAR файла и создания для него библиотеки привязок.

Также обратите внимание, что в конечном итоге вы используете, по крайней мере, несколько смешанную парадигму - например, такие вещи, как "Деятельности", являются объектами, а XML файлы, используемые для определения экрана Android, для всех практических целей являются декларативными. Изменить: Этот последний вопрос немного спорный - см. комментарии.

Одна окончательная возможность: я не проверял это слишком внимательно, но попробую эту ссылку для сайта, утверждающего, что вы можете сделать Scala в Android.

Ответ 4

Между Чистым функционалом и Java существует способ, который является IMO Прагматическим функционалом. Например, Redux достигает этого в арене React.

Моя цель - написать приложение (Activity), имеющее неизменяемое состояние, которое продвигается в результате взаимодействий, является функциональным. В браузере вы можете увидеть, что это сделано с помощью elm (например, язык Haskel, который также является веб-платформой)

Поскольку нам нужно приложение для Android, я открыл Android Studio, который использовал мастер для создания и приложения с панелью действий ящика Navigaton (с Drawer, FloatingActionBar) Затем преобразовали его, чтобы использовать концепции Elm функционального подхода неизменяемой модели в рабочий POC, основанный на небольшом классе и идиомах ElmBase. Код написан в Kotlin (инструмент JetBrains для JVM).

Вы можете найти приложение в моем GitHub https://github.com/saffih/ElmDroid Сладкое место в этом подходе состоит в том, что он использует строго сформулированный Котлин и редактор очень хорошо дополняет код, делая часть кода законченной для меня таким образом, которого я никогда не видел раньше - удивительный опыт (Но для этого требуется использование идиом, таких как закрытый класс и когда это правильно).