又一個基於JVM的程式語言:Flix

banq發表於2021-12-10

Flix 是一種有原則的函式式、命令式和邏輯程式語言,由奧胡斯大學、滑鐵盧大學和開源貢獻者社群開發。
Flix 的靈感來自 OCaml 和 Haskell,以及來自 Rust 和 Scala 的想法。Flix 看起來像 Scala,但它的型別系統基於 Hindley-Milner。Flix 的兩個獨特功能是其多型效果系統和對一流 Datalog 約束的支援。
Flix 編譯為 JVM 位元組碼,執行在 Java 虛擬機器上,支援全尾呼叫消除。Flix 的 VSCode 外掛可用。
詳擊標題
 
Flix 旨在提供其他程式語言無法提供的獨特函式組合,包括:
  • 代數資料型別和模式匹配(如 Haskell、OCaml)、
  • 可擴充套件記錄(如 Elm)、
  • 型別類(如 Haskell、Rust)、
  • 高階別的型別(如 Haskell)、
  • 型別推斷(如 Haskell、OCaml)、
  • 基於通道和程式的併發(如 Go)、
  • 多型效應系統(一個獨特的特性)、
  • 純多型函式(一個獨特的特性)、
  • 一流的 Datalog 約束(一個獨特的函式)
  • 並編譯為 JVM 位元組碼(如 Scala)。 

Flix 從許多其他優秀語言中汲取靈感,包括 Elm、F#、OCaml、Haskell、Rust 和 Scala。Flix 在視覺上類似於 Scala,強調簡潔和關鍵字的使用。 

def main(_args: Array[String]): Int32 & Impure = 
    println("Hello World!");




 

代數資料型別和模式匹配
代數資料型別和模式匹配是函數語言程式設計的基本要素,Flix 以最小的代價支援。

enum Shape {
    case Circle(Int32),
    case Square(Int32),
    case Rectangle(Int32, Int32)
}

def area(s: Shape): Int32 = match s {
    case Circle(r)       => 3 * (r * r)
    case Square(w)       => w * w
    case Rectangle(h, w) => h * w
}

  

型別類
Flix 使用型別類來抽象支援一組通用操作的型別。

class Eq[a] {
    def eq(x: a, y: a): Bool
    def neq(x: a, y: a): Bool = not Eq.eq(x, y)
}

instance Eq[(a1, a2)] with Eq[a1], Eq[a2] {
    def eq(t1: (a1, a2), t2: (a1, a2)): Bool =
        let (x1, x2) = t1;
        let (y1, y2) = t2;
        x1 == y1 and x2 == y2
}

 

併發
Flix 的併發模型受到 Go 的啟發。在 Flix 中,程式透過通道上的不可變訊息傳遞進行通訊。
以下程式生成一個新程式來執行(瑣碎)計算,然後使用通道將結果傳送到主程式。

/// Computes the sum of `x` and `y` and sends the result on the channel `c`.
def sum(x: Int, y: Int, c: Channel[Int]): Unit & Impure =
    c <- (x + y); ()

/// Computes the sum of 21 and 42 using a fresh process.
def main(_args: Array[String]): Int32 & Impure =
    let c = chan Int 1;     // construct a new empty channel for the result.
    spawn sum(21, 42, c);   // spawn sum to run in a separate process.
    <- c                    // wait for the result to arrive on the channel.



 

多型效應:分離純程式碼和不純程式碼
Flix 的一個獨特之處在於它的多型效果系統。Flix 型別和效果系統乾淨地分離純程式碼和不純程式碼。如果表示式是純表示式,那麼它的計算結果總是相同的,並且不會產生副作用。如果一個函式是純函式,那麼當給定相同的引數時,它總是計算為相同的值。

/// A pure function
def sum(x: Int32, y: Int32): Int32 = x + y
/// An impure function
def sayHello(): Unit & Impure = Console.printLine("Hello World")


 

Datalog 約束邏輯程式設計
Flix 的另一個獨特功能是它支援具有一流 Datalog 約束的邏輯程式設計。Datalog 是一種簡單但功能強大的宣告式邏輯程式語言,特別適合對圖進行遞迴查詢。
 

相關文章