Scala 和 Frege 都是针对 JVM 的类型化函数语言。
Frege 更接近 Haskell,Scala 拥有更独立的历史。
但是如果我们不考虑语法差异,那么两者之间允许的编程技术、风格、概念有什么区别?
最佳答案
恕我直言,两者都是非常好的语言,但就范式而言,Scala 在面向对象方面比 Frege 更好,但 Frege 在功能上比 Scala 更好。至于差异,主要归结为 Haskell 与 Scala,因为 Frege 是(或几乎,参见 Haskell 和 Frege 之间的差异 here )Haskell 用于 JVM。
Frege 的类型推断是全局的,因此我们不必像 Scala 中那样频繁地注释类型(局部推断)。
在 Frege 中,模块只是类型和函数的命名空间,而 Scala 拥有更好的模块系统。 http://2013.flatmap.no/spiewak.html
在 Frege 中,函数默认被柯里化(Currying),因此不需要为部分函数应用额外的构造。部分类型构造函数应用程序也是如此。
在 Frege 中,没有
def
与val
之分,一切都是函数。因此函数比 Scala 更一流。Frege 没有子类型,但类型系统会计算出 native 调用的子类型。例如,您可以将
ArrayList
传递给需要 JavaList
的函数。由于没有子类型,在 Frege 中我们现在无法扩展 Java 类或实现接口(interface)(将来可能会支持),因此我们需要一个可以扩展/实现的 Java 类,但方法实现将是从 Frege 作为函数传递。
在 Scala 中,调用 Java 很容易,但在 Frege 中,必须在使用前声明 Java 类/方法(只需类型和纯度注释)。例如,要使用Java的
LinkedList
,data LinkedList a = native java.util.LinkedList where native add :: Mutable s (LinkedList a) -> a -> ST s Bool native get :: Mutable s (LinkedList a) -> Int -> ST s (Maybe a) throws IndexOutOfBoundsException native new :: () -> STMutable s (LinkedList a)
这里,由于函数会改变对象,因此它们必须位于
ST
monad 中。另请注意,这里 Frege 还处理从get
方法返回的null
,因为它是用Maybe
类型注释的。null
可以访问 Frege 程序的唯一方法是通过 native 接口(interface),因为 Frege 没有 null 的概念。另一个例子:
纯原生地板 Math.floor::Double -> Double
它表明该函数是纯函数,因此签名直接反射(reflect)原始 Java 签名,没有
IO
或ST
。Frege 没有 Scala 的
var
中的变量以及副作用 通过类型更加明确。 (只是没有null
,没有var
和明确的副作用使 Frege 更有趣,至少对我来说。从某种意义上说,Frege 和 Haskell 一样,是一种“优秀的命令式编程”语言”,对于 JVM!)作为 Haskell 方言,Frege 对 Functor、Applicatives、Monad 和其他函数“模式”更加自然,并且在其标准库中拥有这些,而在 Scala 中,您可能需要 Scalaz。
Frege 默认情况下是惰性的,但可以在必要时通过
!
启用严格性,而 Scala 默认情况下是严格的,但具有用于惰性评估的lazy
关键字。
尽管如此,作为 JVM 语言,一种语言可以从其他语言中受益。我曾经移植过一个Akka example to Frege 。最后,这取决于严格性、纯度、函数式、面向对象和类型推断以及它们对您的重要性。
关于scala - Scala 和 Frege 之间的主要区别(在编程范式中)是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17905322/