scala - Scala 和 Frege 之间的主要区别(在编程范式中)是什么?

标签 scala haskell functional-programming paradigms frege

Scala 和 Frege 都是针对 JVM 的类型化函数语言。

Frege 更接近 Haskell,Scala 拥有更独立的历史。

但是如果我们不考虑语法差异,那么两者之间允许的编程技术、风格、概念有什么区别?

最佳答案

恕我直言,两者都是非常好的语言,但就范式而言,Scala 在面向对象方面比 Frege 更好,但 Frege 在功能上比 Scala 更好。至于差异,主要归结为 Haskell 与 Scala,因为 Frege 是(或几乎,参见 Haskell 和 Frege 之间的差异 here )Haskell 用于 JVM。

  1. Frege 的类型推断是全局的,因此我们不必像 Scala 中那样频繁地注释类型(局部推断)。

  2. 在 Frege 中,模块只是类型和函数的命名空间,而 Scala 拥有更好的模块系统。 http://2013.flatmap.no/spiewak.html

  3. 在 Frege 中,函数默认被柯里化(Currying),因此不需要为部分函数应用额外的构造。部分类型构造函数应用程序也是如此。

  4. 在 Frege 中,没有 defval 之分,一切都是函数。因此函数比 Scala 更一流。

  5. Frege 没有子类型,但类型系统会计算出 native 调用的子类型。例如,您可以将 ArrayList 传递给需要 Java List 的函数。

    由于没有子类型,在 Frege 中我们现在无法扩展 Java 类或实现接口(interface)(将来可能会支持),因此我们需要一个可以扩展/实现的 Java 类,但方法实现将是从 Frege 作为函数传递。

  6. 在 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 签名,没有 IOST

  7. Frege 没有 Scala 的 var 中的变量以及副作用 通过类型更加明确。 (只是没有 null,没有 var 和明确的副作用使 Frege 更有趣,至少对我来说。从某种意义上说,Frege 和 Haskell 一样,是一种“优秀的命令式编程”语言”,对于 JVM!)

  8. 作为 Haskell 方言,Frege 对 Functor、Applicatives、Monad 和其他函数“模式”更加自然,并且在其标准库中拥有这些,而在 Scala 中,您可能需要 Scalaz。

  9. Frege 默认情况下是惰性的,但可以在必要时通过 ! 启用严格性,而 Scala 默认情况下是严格的,但具有用于惰性评估的 lazy 关键字。

尽管如此,作为 JVM 语言,一种语言可以从其他语言中受益。我曾经移植过一个Akka example to Frege 。最后,这取决于严格性、纯度、函数式、面向对象和类型推断以及它们对您的重要性。

关于scala - Scala 和 Frege 之间的主要区别(在编程范式中)是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17905322/

相关文章:

programming-languages - 如果函数式语言真的很简洁,为什么它们在语言枪战中没有更好的排名呢?

syntax - '==' 类型和模式匹配 - 等待其他递归调用并对案例不执行任何操作

scala - 如何使用值初始化Scala不可变 HashMap ?

regex - Scala 中的惯用正则表达式匹配

regex - 有没有办法在 idris lightyear 库中编写 chainl 函数?

Haskell:最简单的 wai 例子的问题

scala - 设置 sbt 程序集 v0.14.2 时出现问题

scala - Spray.io升级导致specs2中缺少模拟库

haskell - 应该将列表转换为字符串的函数中的解析错误 - haskell

functional-programming - 将命令式转换为函数式代码