又一個基於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 是一種簡單但功能強大的宣告式邏輯程式語言,特別適合對圖進行遞迴查詢。
相關文章
- 又一個全新程式語言,誕生了!
- 基於 10 大程式語言的 30 個深度學習庫深度學習
- 有誰能把這個基於JAM的程式語言做出來
- 用於數學的 10 個優秀程式語言
- 微軟推出基於Excel的低程式碼程式語言:Power Fx微軟Excel
- XLM — 基於BERT的跨語言模型模型
- python程式語言基礎Python
- Julia語言程式基礎
- 基於c語言的TCP客戶端、服務端基礎程式碼C語言TCP客戶端服務端
- JVM 還支援哪些語言JVM
- 滴滴基於Go語言的DevOps重塑之路Godev
- D程式語言基礎篇
- Python語言最常見的8個基礎語句!Python
- 基礎入門: 編寫第一個 Go 語言程式Go
- 可用於解析 Excel 檔案的程式語言Excel
- 基於C語言的Q格式使用詳解C語言
- 各個程式語言語言的檔案/函式/變數的命名方法函式變數
- 基於MDK建立純組合語言--組合語言
- MarkovJunior: 一種基於模式匹配和約束傳播的概率程式語言模式
- C++程式語言的四個準則C++
- 新手的第一個c語言小程式C語言
- 基於go語言gin框架的web專案骨架Go框架Web
- 基於Dart語言的開源後端框架:UpperDart後端框架
- JVM筆記 -- Java跨平臺和JVM跨語言JVM筆記Java
- 用 PHP 寫一個"程式語言"PHP
- 基於c語言的UDP客戶端、服務端二合一基礎程式碼C語言UDP客戶端服務端
- 基於PyTorch的大語言模型微調指南:Torchtune完整教程與程式碼示例PyTorch模型
- 基於函數語言程式設計的領域驅動設計 - Scott Wlaschin函數程式設計
- 終於實現了一門屬於自己的程式語言
- 基於go語言學習工廠模式Go模式
- C語言小知識(基於Linux)——個人筆記,不定時更新C語言Linux筆記
- c語言的基礎C語言
- 這是一個程式語言的釋出貼
- C++程式語言的四個基本準則C++
- 函數語言程式設計的幾個概念函數程式設計
- 天天灌水,來寫點關於程式語言的思考。
- 基於R語言的raster包讀取遙感影像R語言AST
- 基於課程學習(Curriculum Learning)的自然語言理解