Elm 是一門用來打造可靠網頁應用程式的語言,用起來很愉快。它有友善的錯誤訊息、優異的效能、小巧的資源檔案,而且沒有執行時期的例外。
Elm 最有名、也最廣為仿效的部分,大概就是 Elm 架構了。它是一個用來組織網頁應用程式的簡單模式,所有 Elm 網頁應用程式都是照著它寫出來的。
核心概念是:你的程式碼圍繞著應用程式狀態的Model、update你的 model 的方式,以及view你的 model 的方式來打造。
Model包含應用程式的狀態,也就是應用程式需要的所有資料。
想像一個簡單的應用程式,裡面有一個文字輸入框,還有一段顯示該文字反轉結果的文字,那麼 model 會長得像下面這樣。
你也可以在 Elm 指南 上看到這個範例喔。
type alias Model =
{ text : String
}
update是一個函式,當有變化時(例如使用者點擊按鈕),它會被呼叫並收到一個Msg。
它接收Msg和目前的Model,並回傳一個新的Model。
type Msg
= TextChanged String
update : Msg -> Model -> Model
update msg model =
case msg of
TextChanged newText ->
{ model | text = newText }
view是一個函式,會回傳要在瀏覽器中顯示給使用者的 HTML。
它接收目前的Model,並回傳Html Msg(Elm 用來表示 HTML 的型別)。
view : Model -> Html Msg
view model =
Html.div []
[ Html.input
[ Html.Attributes.placeholder "Text to reverse"
, Html.Attributes.value model.text
, Html.Events.onInput TextChanged
]
[]
, Html.div [] [ Html.text (String.reverse model.text) ]
]
你的朋友 Paula 想更擅長解填字遊戲的提示。她讀到有些提示會顯示答案是迴文。 迴文是指一個單字或句子,從後往前讀和從前往後讀都一樣。
她請你幫她寫一個非常簡單的網站,用來檢查某個字串是不是迴文,這樣她就能確認自己猜的答案對不對。
你決定用 Elm 的 [sandbox][browser-sandox] 應用程式來做這件事。
這個應用程式會有一個文字方塊,Paula 可以把她猜的答案輸入進去,另外還會有一段文字,說明方塊裡的內容是不是迴文。 每當文字方塊裡的文字改變時,這段文字就會跟著更新。
Model和Msg型別,並撰寫init函式應用程式的Model需要一個要檢查的字串,這個欄位應該命名為content。
應用程式需要一個Msg來表示文字方塊裡的文字已經改變。
對應的變體應該命名為Change。
init函式應該回傳一個初始的Model值,其中content欄位是空的。
update函式應該接收Msg和Model兩個參數,並回傳一個新的Model。
Msg會帶有使用者輸入的文字,而新的Model應該包含那段文字。
Elm 要求 view 函式必須回傳Html msg型別,也就是說,你必須從 view 函式回傳單一元素(而不是元素組成的陣列)。
在這個根元素裡,應該要有一個input元素(也就是文字方塊),以及一個帶有text內容的div,用來顯示input裡的文字是不是迴文。
這段文字應該是 "This is a palindrome" 或 "Not a palindrome"。
main函式應該呼叫Browser.sandbox,並傳入一個帶有init、update和view函式的 record 參數。
為了讓這個練習能在 Exercism 線上編輯器上運作,我們的程式碼裡搭配使用了假的Browser.sandbox。
這對你為了解這道練習所寫的程式碼沒有任何影響。