【发布时间】:2016-05-24 17:06:51
【问题描述】:
我目前正在阅读 CAR Hoare 的 CSP Book,并尝试使用 Haskell 实现其早期示例。
本书首先定义了一个进程代数——本质上,进程接受事件并返回另一个进程或一个符号 (bleep),表明该进程不参与此事件。 STOP 进程是为任何事件返回 bleep 的进程。
这本书建议您在 LISP 中执行此操作,因此我使用了 Racket。 STOP的定义很简单:
(define (STOP event) 'bleep)
as 是一个“自动售货机”进程,它只接受事件 coin 并返回 STOP:
(define (coin-to-stop event)
(case event
['coin STOP]
[else 'bleep]))
然后我尝试在 Haskell 中实现这些相同的概念。我们没有像 Racket 这样的符号,所以让我们定义Event:
data Event = Ev String deriving (Eq)
与 Racket 不同,我们不能只是捏造 'bleep 和进程之间的区别,所以我们将使用 Maybe 来定义进程的类型:
type Process = Event -> Maybe Process
其中Just p对应一个进程,Nothing对应'bleep。
现在我们可以定义STOP进程:
stop :: Process
stop _ = Nothing
以及“自动售货机”流程:
coinToStop :: Process
coinToStop (Ev "coin") = Just stop
coinToStop _ = Nothing
不幸的是,这不能编译,因为你不能有循环类型定义:
Cycle in type synonym declarations:
src\Csp.hs: type Process = Event -> Maybe Process
我玩了一会儿newtype,但我不太明白我在那里做什么。
我意识到我可以使用以下方法实现大致等效的解决方案:
data ProcResult = P (Maybe Process)
type Process = Event -> ProcResult
但这似乎不必要地难看。
在 Haskell 中表示 Process 概念的正确方法是什么?
【问题讨论】:
-
newtype Process = Process (Event -> Maybe Process)应该可以工作。 -
您可能想查看
chp包 - 似乎他们将进程定义为 monad。 -
你的签名好像错了(
stop,coinToStop带参数你定义它们为常量)