在ScalaWorld 2015上,Edwin Brady就伊德里斯发表了激动人心的演讲 - https://www.youtube.com/watch?v=X36ye-1x_HQ。
在其中一个例子中,我记得他展示了如何使用Idris编写代表有限状态机(FSM)的程序 - 用于打开和关闭门。他的 FSM可能有点复杂,但是,考虑到以下状态:
data DoorState = DOpen | DClosed
data DoorAction = Open | Close
我写了一个函数,给定DoorAction
和DoorState
,返回新的DoorState
。
runDoorOp : DoorAction -> DoorState -> DoorState
runDoorOp Close DOpen = DClosed
runDoorOp Open DClosed = DOpen
但是,上面的函数是部分的,例如:runDoorOp Open DOpen
会崩溃。
我想过使用Either
或Maybe
数据类型,但我认为(从听到这个话题)可以在不使用{的情况下以类型安全的方式对此FSM进行编码{1}}。
使用路径相关类型编写上述函数的惯用Idris方法是什么,而不是使用Either/Maybe
?