跳至內容

Elm語言

出自Taiwan Tongues 台語維基
這是此頁批准,以及是最近的修訂。

Elm是一个領域特定程式語言,用佇聲明式地建立 web 瀏覽器的圖形化使用者介面。Elm 是純函數式的,開發去伊時強調𠢕用性、效能佮健壯性。伊宣傳為「實際上無執行的時間異常」,Elm 編譯器的靜態型別檢查使成做是可能。

歷史

Elm 上原初由 Evan Czaplicki 佇二空一二年做畢業論文《Elm:用於函數式 GUI 的並行 FRP》猶閣設計的。Elm 的頭一擺發行帶足濟例佮一个線頂編輯器,予得人較𠢕佇咧 web 瀏覽器中試驗伊。Evan 佇二空一三年加入 Prezi 從事 Elm 的工課,而且佇二空一六年轉移到 NoRedInk 作為開源工程師,啟動矣 Elm 軟體基金會。

Elm 編譯器的上頭實現執行目標為 HTML、CSS 和 JavaScript。核心工具集持續咧擴充,這馬包括矣 REPL、包管理器、時間旅行除錯器佮針對 macOS 佮 Windows 的安裝器。Elm 閣有一个生態系統,包括社群建立的庫佮 Ellie,伊是一个進階線頂編輯器,允准儲存的工課佮包含社群庫。

特徵

Elm 有一个小集合的語言構造,包括傳統的 if 表達式,let 表達式用佇局部的狀態,和 case 表達式嘛會當用做模式的匹配。做函數式的語言,伊預設的支援匿名函式,函式做為實際參數,佮部份應用。伊的語意包括不可變的值,無狀態函式,閣有類型推論的靜態型別。Elm 程式通過虛擬的 DOM 呈現 HTML,猶閣會使用「JavaScript 做服務」來佮其他的代碼來進行互操作。

不可變性

佇咧 Elm 中所有的值攏是不可變的,這意味著一个值袂當佇咧建立了後修改。Elm 使用永續性的資料結構來實現伊的 ` Array `、` Dict ` 和 ` Set ` 庫。

靜態型別

Elm 是靜態型別項的。類型標註(annotation)是可選的(因為有類型推論)毋過強烈鼓勵。標註存佇定義之上的一行(無仝 C 家族語言,遮的類型佮名是挾雜做伙的)。 Elm 使用單一的冒號表達「有類型」。

類型包括原始類型如整數和字串,佮基本資料結構比如講列表、元組佮記錄。函式有用箭頭寫做的類型,比如講 ` round  : Float-> Int `。定做化類型允准編程者建立客製化類型,以匹配特定的問題領域的方式來表示資料。

類型會當推論出其他的類型,比如講 ` List Int `。類型總是首字母大寫;小寫名是類型變數。比如講,` List a ` 是未知類型的有值的列表。伊是空串列佮予 ` List . length ` 的實際參數的類型,對這个列表的元素來講伊是袂當知的。有一寡特殊類型,編程者建立用來和 Elm 執行的時進行互動。比如講,` Html Msg ` 表示(虛擬)DOM 樹,其實事件處理類型 ` Msg ` 的所有產生訊息。

無閣再允准任何值是隱含的可空值(比如講 JavaScript 的 ` undefined ` 抑是空指標), Elm 的標準庫定義矣 ` Maybe a ` 類型。產生抑是處理一个會當選值的代碼無顯式的使用這个類型,啊若所有其他的代碼得著保證聲稱了類型的值是實際上存在的。

Elm 提供有限數目的內建類的型類:` number `,伊包括 ` Int ` 和 ` Float `,用來利用這數值算符比如講 ` ( + ) ` 抑是 ` ( * ) `;` comparable `,伊包括數值、字元、字捾、可比較者的列表佮可比較者的元組,用來利用較算符;和 ` appendable `,伊包括字串佮列表,用來利用 ` ( + + ) ` 做串接。Elm 無欲提供共遮的類型包括入遮的類型類,抑是建立新類型類的機制(參見限制章節)。

模組系統

Elm 有模組系統來允准使用者共其代碼分解著叫做模組的閣較細的部份內底。模組會當藏實現細節譬如幫助函式,並組織有關的代碼做伙。模組為會當回入代碼充當號名空間,比如講 ` Bitwise . and `。第三方庫(抑是包)構成自一个抑是幾个模組,並會使對 Elm 公共庫內底得著。所有的庫攏採用語意版本號,這是編譯器佮其他的工具所強制的。就是講乎,移除一个函式抑是改變伊的類型干焦會當佇主要發行當中進行。

仝 HTML、CSS 和 JavaScript 的互操作

Elm 使用叫做埠的抽象來和 JavaScript 通批。伊允准值流入佮流出 Elm 程式,確使矣佇 Elm 和 JavaScript 之間的通信。

Elm 有一个叫做 elm / html 的庫,編程者會當用來佇 Elm 內書寫咧 HTML 和 CSS。伊使用虛擬 DOM 方式來使更新有效率。

後端

Elm 官方上無支援侍服器捀開發。核心開發團隊無將伊做為主要的目標考慮,並且偏好聚焦佇咧增進前端開發體驗頂懸的開發。就算講按呢,有一寡獨立的計畫,𪜶咧試探索將 Elm 用佇咧後壁捀的可能性。遮的計畫主要系附於 Elm 版本空壕一八 . 零,因為更新的版本無支援「原生」代碼佮其他會當利用特徵。有兩个咧試將 Elm 用佇咧 BEAM(Erlang 虛擬機器)之上。其中一个計畫直接佇這个環境上執行 Elm,毋過另外一个計畫共編譯做 Elixir。閣有一个咧試通過 Node . js 下部結構為 Elm 建立了後捀框殼。遮的計畫攏無準備好用佇生產。

Elm 架構

Elm 架構是建造互動式 web 應用的模式。Elm 應用本質上以這種方式來構造,但是其他的專案可能發覺著這个概念足有路用。

Elm 程式總是分解做三个部份:

  • 模型:這个應用的狀態,
  • 視圖:一个共模型轉變做是 HTML 的函式,
  • 更新:一个是因為訊息閣較新模型的函式。

這是 Elm 架構的核心。

比如講,想像顯示一个數值佮咧揤的時陣增加這个數值的一个開關的一个應用。佇這个情形下,所有的咱需要儉的是一个數值,所以阮的模型會用得簡單的就是 ` type alias Model=Int `。` view ` 函式將用 ` Html ` 庫來定義並顯示這个數值佮揤鈕。為著欲予這个數值予人閣較新,咱需要會當向 ` update ` 函式傳送訊息,這是通過客製化類型比如講 ` type Msg=Increase ` 來完成的。` Increase ` 值予人牢咧 ` view ` 函式內定義的開關,使得咧使用者點擊這个開關的時陣,` Increase ` 去予傳達去 ` update ` 函式之上,伊會當通過增加這个數值來更新這个模型。

佇咧 Elm 架構內底,傳送訊息到 ` update ` 是改變狀態的唯一方式。佇閣較複雜的應用,訊息會當來自各種來源:使用者互動,模型的初化,來自 ` update ` 的內部呼叫,訂閱的外部事件(窗口改變大細、系統時鐘、JavaScript 互操作等等)和 URL 變更佮請求。

限制

Elm 無支援高種類多型,這是仝為函數式的語言 Haskell 和 PureScript 所提供的,Elm 閣無支援建立類型類。

這意味對,比如講 Elm 無迒過濟種資料結構親像 ` List ` 和 ` Set ` 的通用的 ` map ` 函式。佇咧 Elm 中,這款函式典型的欲限定這个𪜶的模組名來呼叫,譬如講相叫 ` List . map ` 和 ` Set . map `。佇咧 Haskell 抑是 PureScript 中,干焦一个函式 ` map `。自從二空一五年這就是佇 Czaplicki 的粗略路線圖面頂的一个周知的特徵要求。

另外一个缺陷是佇中到大型專案中有大量的樣板代碼,如《Elm in Action》作者佇𪜶的單一頁面應用例中所展示的按呢,具有差不多仝款的片段被重複於更新、視圖、訂閱、路由解析佮建造函式內底。

樣例代碼

下跤的例代碼通過注釋展示矣 Elm 的基本特徵:

參見

  • PureScript:一个強型別的、純函數式的編譯做 JavaScript 的程式語言。
  • Reason:OCaml 的語法擴充佮工具鏈,嘛會當轉譯做 JavaScript。
  • 函數式回應式編程

參照

外部連結

  • 官方網站
  • Awesome Elm . [二千空二十一孵三孵二] .(原始內容存檔佇兩千空二十一抹一鋪十七).