Elm.js 學(xué)習(xí)筆記

Elm基礎(chǔ)語法

常用數(shù)據(jù)結(jié)構(gòu)

列表List : 只能容納單一類型元素,是類型的容器而不是類型萄窜,List String才是類型
元祖Tuples:可為不同類型壹店,固定長度小于10
Records : 具有鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)

List (列表)

list 方法
List.drop 1 [1,2,3,4]   —  [1,2,3]
List.length [1,2,3,4]   — 4
List.head [1,2,3,4]     — Just 1 : Maybe.Maybe number
List.tail [1,2,3,4]     — Just [2,3,4] : Maybe.Maybe (List number)
List.reverse [1,2,3,4]  — [4,3,2,1] : List number           反序
List.sort [1,4,3,2] — [1,2,3,4] : List number           排序 
List.maximum a      — Just 4 : Maybe.Maybe number   最大值
List.minimum a      — Just 1 : Maybe.Maybe number   最小值 
0::[1,2,3,4]        — [0,1,2,3,4] : List number     “::”向列表添加元素0 
[-1,-2]++[0,1,2,3,4]    — [-1,-2,0,1,2,3,4] : List number   “++”拼接列表

tuples (元組)

records (記錄)

point = { x = 3, y = 4 }                -- create a record
point.x                                 -- 訪問字段
List.map .x [point,{x=0,y=0}]           -- field access function
{ point | x = 6 }                            -- update 字段
{ point | x = point.x + 1, y = point.y + 1}  -- update 多個(gè)字段
dist {x,y} = sqrt (x^2 + y^2)                -- pattern matching on fields

type alias Location =    { line : Int , column : Int}    -- type aliases for records

{x=3,y=7}.x  or .y {x=3,y=7} //.y為一個(gè)函數(shù)
bill = {name = “cyq”, age = 20}
bill2 = {bill | name = “222”}   copy一份bill — { name = “222”, age = 20 } : { age : number, name : String }
  • 你不可以使用不存在的field.
  • field不可為 undefined 或是 null.
  • 你不可以使用 this 或 self 等關(guān)鍵字來創(chuàng)造遞迴的 records

模式匹配

有點(diǎn)類似es6的desttructuring

中綴運(yùn)算符 (可自定義)

您可以創(chuàng)建自定義中綴運(yùn)算符疯溺。 優(yōu)先級(jí)從0到9,其中9是最緊密的倔既。默認(rèn)優(yōu)先級(jí)為9善已,默認(rèn) 關(guān)聯(lián)性為左。您可以自行設(shè)置池户,但不能覆蓋內(nèi)置運(yùn)算符阎曹。

模塊

module MyModule exposing (..)
-- qualified imports
import List                    -- List.map, List.foldl
import List as L               -- L.map, L.foldl

-- open imports
import List exposing (..)               -- map, foldl, concat, ...
import List exposing ( map, foldl )     -- map, foldl

優(yōu)先進(jìn)口合格。模塊名稱必須與其文件名匹配煞檩,因此模塊Parser.Utils需要在文件中Parser/Utils.elm处嫌。

類型注釋

一些常見的類型:Int,F(xiàn)loat斟湃,String熏迹,Bool

型別別名 (type alias)

有時(shí)候,單純的基本型別可能無法完全詮釋我們想要表達(dá)的意思凝赛,也有可能是資料結(jié)構(gòu)太複雜注暗,我們想用一個(gè)簡單的名稱稱呼它,這時(shí)型別別名就可派上用場墓猎。

type alias Name = String
type alias Age = Int
type alias Person =
    { name: String
    , age: Int
    }

createPerson: Name -> Age -> Person
createPerson name age =
    { name = name
    , age = age
    }

type alias Name = String 的意思可以翻譯為 將 Name 設(shè)定為 String 的另一個(gè)別名捆昏。如此一來,我們就可以像這樣定義:
createPerson: Name -> Age -> Person
而不是
createPerson: String -> Int -> Person

自定義類型:(建立自創(chuàng)型別與 Union Type)

自創(chuàng)型別的方法如下:
type Directions = Up | Down | Left | Right
type Maybe a = Nothing | Just a
我們可以創(chuàng)造兩種不同款式的型別毙沾,第一種像是上例的 Directions 比較直觀簡單骗卜,在這型別下只會(huì)有四種可能的值,就是我們定義的 Up,Down寇仓,Left举户,Right。在使用上的話我們可以這麼做:

convertDirectionsToInt: Directions -> Int
convertDirectionsToInt dir =
    case dir of
        Up -> 1
        Down -> 2
        Left -> 3
        Right -> 4

convertDirectionsToInt Up -- 1

Union Types

用來表示一組可能的值遍烦,每個(gè)值叫做一個(gè)Tag
指的是我們可以將其它已存在的型別組合進(jìn)我們自創(chuàng)的型別中俭嘁。範(fàn)例中我們建立了一個(gè)叫 Maybe 的型別,後面跟著的 a 是所謂的 型別變數(shù)服猪,再更後面則是型別的值供填。我們可以自由在型別變數(shù)中帶入其他的型別如下:

-- 把 String 帶入 a
maybeString: Maybe String
maybeString = Just "I am a string"

-- 把 Int 帶入 a
maybeInt: Maybe Int
maybeInt = Just 1

anotherMaybeInt: Maybe Int
maybeInt = Nothing

以上三個(gè)變數(shù)都是屬於 Maybe a 型別,但隨著帶入的 a 不同罢猪,型別裡的值也會(huì)跟著改變近她。當(dāng)然你也可以建立更複雜的 Union Type,例如:
type Directions a b = Up a | Down b | Left a b | Right

javascript 互操作

  1. 在HTML中嵌入Elm坡脐,
  2. 在Elm和JavaScript之間來回發(fā)送消息

函數(shù)

multiply a b = a*b
double = multiply 2
List.map double [1,2,3,4]

-- 通過匿名函數(shù)形式。
List.map (\a -> a * 2) [1..4] -- [2, 4, 6, 8]

\counterMsg -> Modify id counterMsg是Elm中的匿名函數(shù)房揭,在Elm中备闲,匿名函數(shù)使用\開頭緊接著參數(shù),
并在->后書寫返回值表達(dá)式捅暴,形如\a -> b恬砂。

-- 通過let...in...語句來定義來定義一些將要立即使用的值。

volume {width, height, depth} = let area = width * height in area * depth
volume { width = 3, height = 2, depth = 7 } -- 42

函數(shù)名 參數(shù) =

控制語句

if true then “WHOA” else if true then “n” else “0”

case alist of
[]->””
[x]->””
x::xs->””

elm 工程化

elm-webpack-project 腳手架
git clone https://github.com/moarwick/elm-webpack-starter 
rm -rf .git        
git init   git add .   git commit -m 'first commit'
npm run reinstall  安裝依賴

自己搭建

----package.json
 "scripts": {
    "elm-install": "elm-package install",
    "build": "elm-make Main.elm --output=build/index.js",
    "start": "elm-live Main.elm --output=build/index.js --open" 
  },
  "devDependencies": {
    "elm": "^0.18.0",
    "elm-live": "^2.7.4" //熱更新蓬痒,熱加載模塊
  }


-----elm-package.json
 "dependencies": {
        "elm-lang/core": "5.0.0 <= v < 6.0.0",
        "elm-lang/html": "2.0.0 <= v < 3.0.0",
        "elm-lang/http": "1.0.0 <= v < 2.0.0",
        "evancz/elm-markdown": "3.0.1 <= v < 4.0.0"
  },
  "elm-version": "0.18.0 <= v < 0.19.0"



-------index.html
<div id=“main”></div>
<script type="text/javascript">
      var node = document.getElementById(‘main’);
      var app = Elm.Main.embed(node);
 </script>


-----
npm i
npm run elm-install
npm run start

官網(wǎng)示例庫

git clone https://github.com/evancz/elm-architecture-tutorial.git
cd elm-architecture-tutorial

學(xué)習(xí)資源
Elm入門實(shí)踐系列
https://segmentfault.com/a/1190000005701562
初識(shí)Elm語言你只需要Y分鐘
https://github.com/Jocs/jocs.github.io/issues/2
Elm架構(gòu)教程
https://segmentfault.com/a/1190000004872909

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泻骤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梧奢,更是在濱河造成了極大的恐慌狱掂,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,657評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亲轨,死亡現(xiàn)場離奇詭異趋惨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)惦蚊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,662評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門器虾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蹦锋,你說我怎么就攤上這事兆沙。” “怎么了莉掂?”我有些...
    開封第一講書人閱讀 158,143評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵葛圃,是天一觀的道長。 經(jīng)常有香客問我,道長装悲,這世上最難降的妖魔是什么昏鹃? 我笑而不...
    開封第一講書人閱讀 56,732評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮诀诊,結(jié)果婚禮上洞渤,老公的妹妹穿的比我還像新娘。我一直安慰自己属瓣,他們只是感情好载迄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,837評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抡蛙,像睡著了一般护昧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粗截,一...
    開封第一講書人閱讀 50,036評(píng)論 1 291
  • 那天惋耙,我揣著相機(jī)與錄音,去河邊找鬼熊昌。 笑死绽榛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的婿屹。 我是一名探鬼主播灭美,決...
    沈念sama閱讀 39,126評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昂利!你這毒婦竟也來了届腐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,868評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤蜂奸,失蹤者是張志新(化名)和其女友劉穎犁苏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扩所,經(jīng)...
    沈念sama閱讀 44,315評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡傀顾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,641評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碌奉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片短曾。...
    茶點(diǎn)故事閱讀 38,773評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赐劣,靈堂內(nèi)的尸體忽然破棺而出嫉拐,到底是詐尸還是另有隱情,我是刑警寧澤魁兼,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布婉徘,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏盖呼。R本人自食惡果不足惜儒鹿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望几晤。 院中可真熱鬧约炎,春花似錦、人聲如沸蟹瘾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,859評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憾朴。三九已至狸捕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間众雷,已是汗流浹背灸拍。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砾省,地道東北人鸡岗。 一個(gè)月前我還...
    沈念sama閱讀 46,584評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像纯蛾,于是被迫代替她去往敵國和親纤房。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纵隔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,676評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容