又一個基於JVM的程式語言:Flix
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 是一種簡單但功能強大的宣告式邏輯程式語言,特別適合對圖進行遞迴查詢。
相關文章
- Scala,基於JVM的併發語言JVM
- 又一個全新程式語言,誕生了!
- java環境中基於jvm的兩大語言:scala,groovyJavaJVM
- 基於 10 大程式語言的 30 個深度學習庫深度學習
- 有誰能把這個基於JAM的程式語言做出來
- R語言網路資料抓取的又一個難題,終於攻破了!R語言
- 微軟推出基於Excel的低程式碼程式語言:Power Fx微軟Excel
- 基於物件的JavaScript語言(轉)物件JavaScript
- 用於數學的 10 個優秀程式語言
- 下一個偉大的JVM語言是什麼?JVM
- JVM相容語言 stabJVM
- XLM — 基於BERT的跨語言模型模型
- goweb,基於go語言的API框架GoWebAPI框架
- 一個關於pynoi遊戲的C語言程式設計遊戲C語言程式設計
- Julia語言程式基礎
- 基於c語言的TCP客戶端、服務端基礎程式碼C語言TCP客戶端服務端
- JVM 還支援哪些語言JVM
- 基於CMPP2.0的Socket客戶端(Java) - JAVA程式語言客戶端Java
- goweb,基於go語言API框架GoWebAPI框架
- 程式語言的六個標準
- 王垠:關於程式語言的思考
- 關於中國人自己的程式語言!
- D程式語言基礎篇
- python程式語言基礎Python
- 程式語言十萬個為什麼之java web的基礎概念JavaWeb
- 基於C語言的Q格式使用詳解C語言
- 滴滴基於Go語言的DevOps重塑之路Godev
- 【工具】一款基於go語言的agentGo
- 基礎入門: 編寫第一個 Go 語言程式Go
- 基於MDK建立純組合語言--組合語言
- 基於Go語言來理解TensorflowGo
- 基於 Go 語言來理解 TensorflowGo
- Python語言最常見的8個基礎語句!Python
- 可用於解析 Excel 檔案的程式語言Excel
- 基於JAVA語言的selenium測試基礎總結Java
- C語言第一個程式C語言
- 最‘乾淨’的程式語言——空白程式語言
- TIOBE 釋出 12 月程式語言排行榜,4個程式語言角逐年度語言