Elm.js 学习笔记

Elm基础语法

常用数据结构

列表List : 只能容纳单一类型元素,是类型的容器而不是类型,List String才是类型
元祖Tuples:可为不同类型,固定长度小于10
Records : 具有键值对的数据结构

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 多个字段
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为一个函数
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 等關鍵字來創造遞迴的 records

模式匹配

有点类似es6的desttructuring

中缀运算符 (可自定义)

您可以创建自定义中缀运算符。 优先级从0到9,其中9是最紧密的。默认优先级为9,默认 关联性为左。您可以自行设置,但不能覆盖内置运算符。

模块

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

优先进口合格。模块名称必须与其文件名匹配,因此模块Parser.Utils需要在文件中Parser/Utils.elm。

类型注释

一些常见的类型:Int,Float,String,Bool

型別別名 (type alias)

有時候,單純的基本型別可能無法完全詮釋我們想要表達的意思,也有可能是資料結構太複雜,我們想用一個簡單的名稱稱呼它,這時型別別名就可派上用場。

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 設定為 String 的另一個別名。如此一來,我們就可以像這樣定義:
createPerson: Name -> Age -> Person
而不是
createPerson: String -> Int -> Person

自定义类型:(建立自創型別與 Union Type)

自創型別的方法如下:
type Directions = Up | Down | Left | Right
type Maybe a = Nothing | Just a
我們可以創造兩種不同款式的型別,第一種像是上例的 Directions 比較直觀簡單,在這型別下只會有四種可能的值,就是我們定義的 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

用来表示一组可能的值,每个值叫做一个Tag
指的是我們可以將其它已存在的型別組合進我們自創的型別中。範例中我們建立了一個叫 Maybe 的型別,後面跟著的 a 是所謂的 型別變數,再更後面則是型別的值。我們可以自由在型別變數中帶入其他的型別如下:

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

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

anotherMaybeInt: Maybe Int
maybeInt = Nothing

以上三個變數都是屬於 Maybe a 型別,但隨著帶入的 a 不同,型別裡的值也會跟著改變。當然你也可以建立更複雜的 Union Type,例如:
type Directions a b = Up a | Down b | Left a b | Right

javascript 互操作

  1. 在HTML中嵌入Elm,
  2. 在Elm和JavaScript之间来回发送消息

函数

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

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

\counterMsg -> Modify id counterMsg是Elm中的匿名函数,在Elm中,匿名函数使用\开头紧接着参数,
并在->后书写返回值表达式,形如\a -> b

-- 通过let...in...语句来定义来定义一些将要立即使用的值。

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

函数名 参数 =

控制语句

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

官网示例库

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

学习资源
Elm入门实践系列
https://segmentfault.com/a/1190000005701562
初识Elm语言你只需要Y分钟
https://github.com/Jocs/jocs.github.io/issues/2
Elm架构教程
https://segmentfault.com/a/1190000004872909

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容