gpt4 book ai didi

haskell - 如何使用类型系统编码和执行合法的 FSM 状态转换?

转载 作者:行者123 更新时间:2023-12-04 03:03:54 25 4
gpt4 key购买 nike

假设我有一个类型 Thing拥有国有属性(property)A | B | C ,
和合法的状态转换是 A->B, A->C, C->A .

我可以写:
transitionToA :: Thing -> Maybe Thing
这将返回 Nothing如果 Thing处于无法转换到 A 的状态.

但我想定义我的类型和转换函数,以便只能在适当的类型上调用转换。

一个选项是创建单独的类型 AThing BThing CThing但这在复杂情况下似乎无法维护。

另一种方法是将每个状态编码为它自己的类型:

data A = A Thing
data B = B Thing
data C = C Thing


transitionCToA :: C Thing -> A Thing
这对我来说似乎更干净。但我突然想到,A、B、C 是仿函数,除了转换函数之外,所有的事物函数都可以被映射。

使用类型类,我可以创建如下内容:
class ToA t where  
toA :: t -> A Thing

这似乎更清洁。

是否有其他可以在 Haskell 和 PureScript 中使用的首选方法?

最佳答案

这是一种相当简单的方法,它使用(可能是幻像)类型参数来跟踪 Thing 的状态。位于:

{-# LANGUAGE DataKinds, KindSignatures #-}
-- note: not exporting the constructors of Thing
module Thing (Thing, transAB, transAC, transCA) where

data State = A | B | C
data Thing (s :: State) = {- elided; can even be a data family instead -}

transAB :: Thing A -> Thing B
transAC :: Thing A -> Thing C
transCA :: Thing C -> Thing A

transAB = {- elided -}
transAC = {- elided -}
transCA = {- elided -}

关于haskell - 如何使用类型系统编码和执行合法的 FSM 状态转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32059650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com