elm模型案例 elm模型的基本原则


elm模型案例 elm模型的基本原则

文章插图
1.初始设置今天编写一个elm应用实例 。首先 。做好初始设置 。
Elm init 运行命令后 。会在目录中创建一个elm.json配置文件 。以及一个名为src的目录 。咱们在该目录中用编辑器 。可以是vscode、atom等专门甚至最简单的记事本 。在src目录中创建一个名为main.elm文件 。该文件就是要编写应用代码的数据文件 。
用编辑器打开文件 。建议用vscode,最世界上最流行的程序代码编辑工具 。
初次设置完成后 。正式进入elm编程之旅 。
2.薛定谔的猫估计许多人都听说过薛定谔的猫的实验 。在一个封闭的房间中放入一只活猫 。房间中放置有毒药陷阱 。因为房间是密封的 。在房门关闭时 。咱们无法从外面的世界观测到猫是死是活 。因此猫处在一种非死非活的不确定性状态中;当咱们打开房门时 。可以观察到猫的状态 。猫的死活也确定下来 。薛定谔的猫阐述的是一种量子不确定现象 。
咱们的任务就是编写模拟薛定谔的猫实验的elm应用代码 。
elm模型案例 elm模型的基本原则

文章插图
3.定义规则咱们需要定义一个包含门、锁、毒药陷阱(拔掉保护安全险丝时开始运转)三种事物的房间 。
规则1:如果门开 。那么拔掉保护安全险丝 。
规则2:如果保护安全险丝被拔掉 。它能够重新放上 。
规则3:如果门开 。重新放保护安全险丝 。
规则4:如果门开 。能关门 。
规则5:如果门关 。能开门或上锁 。
规则6:如果上锁 。能解锁 。
每一种事物都可以用多种可能的状态组合表示 。并且明确可能状态之间的转换规则是什么 。
上述规矩转成对象状态如下:
-- 可能的状态:
Door(门):
Locked(上锁)
Closed(关门)
Opened(开门)
Alarm(毒药陷阱):
Armed (触发)
Disarmed (没触发)
Triggered(保护安全险丝)
--可能的状态组合有:
Locked + Armed(上锁+毒药陷阱触发)
Locked + Triggered(上锁+拔掉保护安全险丝)
Locked + Disarmed (上锁+毒药陷阱没有触发)
Unlocked + Armed (开锁+毒药陷阱触发)
Unlocked + Triggered (开锁+拔掉保护安全险丝)
Unlocked + Disarmed (开锁+毒药陷阱没有触发)
Opened + Triggered (开门+拔掉保护安全险丝)
Opened + Disarmed(开门+毒药陷阱没有触发)
--互相转换的状态有:
Door(门):
Closed <-> Locked (关门 <-> 上锁)
Closed <-> Opened (关门 <-> 开门)
Alarm(毒药陷阱):
Armed -> Triggered (毒药陷阱触发 -> 拔掉保护安全险丝)
Triggered -> Disarmed (拔掉保护安全险丝 -> 毒药陷阱没有触发)
Armed <-> Disarmed (毒药陷阱触发 <-> 毒药陷阱没有触发)
4.建立模型OK 。规则确定好后 。咱们会看到 。在监测开始的期间点 。房间只能真正存在一种可能的状态组合 。因此要定义一个显示房间状态的模型model 。它包括了监测期间点时的状态等 。这个模型要将失败的情景加上去 。防止观测不到的错误产生 。用自定义类型添加到mail.elm代码中去 。
type Model= DisplayingRoom DoorState AlarmState| Failure Stringtype DoorState= Opened| Closed| Lockedtype AlarmState= Armed| Disarmed| Triggered 好了 。咱们薛定谔的猫模型建立起来 。完成第一步代码 。
elm模型案例 elm模型的基本原则

文章插图
5.建立更新模型的逻辑要对模型进行更新 。一定要有信息通知到达才能开始更新 。因此更新逻辑前需先定义消息:
type Msg= Open| Close| Lock| Unlock| Arm| Disarm 消息定义后 。开始定义update更新函数 。实现消息->模型->返回一个新模型 。咱们先从检查房间状态开始定义:
update msg model =case model ofDisplayingRoom doorState alarmState ->...Failure errorMessage ->model 先建立函数框架 。如果因为问题原因无法观测到房间状态 。那么更新函数只能返回原来的模型model 。
当可以正常地观测房间时 。如果房门处于打开状态下 。受到的限制最大:门开、锁解、毒药陷阱不能起作用 。
第一步 。让咱们添加房门打开时的更新代码 。扩展原来基本框架:
update : Msg -> Model -> Modelupdate msg model=case model ofDisplayingRoom doorState alarmState ->case doorState ofOpened ->case msg ofClose ->DisplayingRoom Closed alarmState_ -> Failure "问题 。观测不到!”Failure _ ->model 直到门关 。毒药陷阱才可能被触发 。

推荐阅读