问题 android上的纯函数式编程


这个领域有进步吗?我希望能够在Haskell或类似语言的Android上编写纯功能代码。我已经尝试过使用Scala的一些例子,但开始时似乎很痛苦。我可以用来编写Android应用程序的其他功能JVM语言吗?

编辑:编写本机Android应用程序的函数语言。我对JVM的错误。


10527
2018-01-24 05:15


起源

我认为Clojure也在JVM上运行。我没有经验。 - 4castle
“入门似乎很痛苦” 大多数函数式编程语言都有陡峭的学习曲线。为了使其成为主题,我认为你应该问一下如何在Android中使X语言工作。 Android没有使用JVM,因此这是最可能的痛点。要求人们推荐编程语言是基于意见的。 - 4castle
我正在谈论更多关于gradle构建等等。有时候存在的例子是 单一活动你好世界节目。我要求更多的成熟度,工具和东西 - user3574294
scala并不是一个开始的痛苦。 - 获取sbt,添加相应的插件,去吧 - pfn


答案:


我怀疑你能为Android编写类似Haskell的代码找到任何成熟的东西。您需要实现Android API所需的Java抽象(实现活动等)。

但是如果你真的想用纯函数风格的Android编写,你可以尝试用纯函数语言实现你的业务逻辑,编译成JVM并从你的Java类中调用它。这种方法比完全以纯粹的功能方式实现它要简单得多。

作为您的语言选择,您可以尝试


5
2018-01-24 06:13



是否有任何使用froid构建的应用程序? - user3574294
@ user3574294我不知道。我估计大多数android应用程序都不是开源的,但你可以尝试在Github上搜索froid用法。在你寻找成熟和ML风格不是一个要求,你可以尝试Kotlin + Anko。它将允许您编写功能代码,但不保证纯度。 - SerCe


我想要Gradle构建等方面的无痛解决方案,你只有两个选择:Java和 科特林,当然你应该选择 科特林 ;)

科特林 有大部分你需要用功能风格写的东西:

  • 作为一等公民的功能
  • 高阶函数
  • 不可变的集合
  • var 和 val 就像Scala一样
  • if-else 作为声明
  • 模式匹配的元素(where 声明)
  • 尾递归
  • 和更多...

如果你也包括 funKTionale 和 kotlinx.collections.immutable,你将拥有所有功能性的好东西: OptionTry,currying,memoization,持久数据结构等......

从Kotlin开始,只需安装最新的 Android Studio 3预览版,已经内置了Kotlin支持。

顺便说一句,不要那么极化为“纯粹”功能;)毕竟,100%“纯”意味着没有副作用,这意味着你的应用程序无法与用户互动;)

希望这可以帮助 :)


4
2017-07-04 19:52



为什么这个评论有下注?我认为值得更多的积极投票 - Derekyy


我从来没有亲自尝试过,但你可以使用Xamarin.Android进行F#编程(我相信,也可以使用Xamarin Forms)。你可以看到指南 这里。 (它还包括示例代码)。

作为一些背景知识,F#是.NET Framework的功能语言。它来自ML;事实上,许多ML脚本几乎可以“直接”编译为F#(需要注意的是你可能需要重命名,因为F#有一些额外的关键字ML没有,以支持几个特定于.NET的扩展) 。

Xamarin允许Android,iOS和Windows手机的本机开发。 Xamarin Forms允许所有三个平台的单一代码库(它是Ionic的竞争对手)。

还有一点:Android确实如此  即使您使用Java编写应用程序,也要使用JVM。 (事实上​​,Android 甚至不支持所有Java 8功能 然而)。通过Android 4.4使用它 的Dalvik;之后,它开始使用 Android运行时

您还可以尝试使用像Scala这样的JVM语言来创建JAR文件并为其创建绑定库。

还请注意,您最终将使用至少某种混合范例 - 例如,活动之类的东西就是对象,而用于定义Android屏幕的XML文件,出于所有实际目的,都是声明性的。 编辑: 最后一点有点值得商榷 - 请参阅评论。

最后一种可能性:我没有仔细检查过这个问题,但也尝试了 这个链接 对于声称可以在Android中执行Scala的网站。


2
2018-01-24 05:39



活动可能是对象,但这并不一定意味着解决方案将面向对象。 - 4castle
@ 4castle我不确定我是否遵循 - 我认为这意味着你至少使用了多种范式(功能,声明和面向对象)。 - EJoshuaS
我说面向对象编程是一种范例。对象是一种数据类型。正如面向对象的编程语言可以在不进行任何函数编程的情况下使用函数一样,函数式编程语言也可以使用对象而不是面向对象。范例的定义不仅仅是它们的主要数据类型。 - 4castle
@ 4castle这是一个合理的观点。 - EJoshuaS
在Android上使用F#的另一个来源(通过Xamarin或HTML5应用程序) fsharp.org/use/android - phil v


之间 纯功能 和 Java的,有一种方式是IMO 务实的功能。例如 终极版 实现了 应对 竞技场。

我的目标是编写一个具有不可变状态的应用程序(Activity),该状态由于交互功能而提升。 在浏览器中,您可以看到完成 榆树 (Haskel喜欢也是web平台的语言)

由于我们想要一个Android应用程序,我打开了 Android Studio 使用向导创建和使用Navigaton抽屉操作栏(带抽屉,FloatingActionBar), 然后将其转换为使用 榆树的概念 不可变模型功能方法基于小型ElmBase类和习语的工作POC。 代码是用来写的 科特林 (JetBrains JVM的首选工具)。

你可以在我的GitHub上找到这个应用程序 https://github.com/saffih/ElmDroid 这种方法的最佳点是它利用了Kotlin的强类型,并且编辑器可以很好地编写代码完成, 以我以前从未见过的方式为我完成了许多代码 - 令人惊叹的体验(但它需要使用类似于 密封 上课和 什么时候 正确)。


1
2018-04-25 16:21