在关于并发性的一般练习中基于这个article。
我们有:
-- a is the result type on which after we continue
type Continuation a = a-> Action
type ContinuationPseudoMonad a = Continuation a -> Action
-- pseudoMonad because it will need Concurrent wrapper Monad:
-- so as to define bind operation and return operation on it
data Concurrent a = Concurrent (ContinuationPseudoMonad a)
所以Concurrent a
是一个单子,我们必须用它的两个强制性法则return和bind来实现它。
不幸的是,我找不到足够的词语来更精确地定义ContinuationPseudoMonad ......如果我缺少词语,我的头脑中就缺少抽象。
你会怎么称呼它?
有没有一个词的意思是Continuation a -> Action
,而不是我尴尬的无意义的ContinuationPseudoMonad
?
行动是:
data Action = Atom (IO Action)
| Fork Action Action
| Stop
2条答案
按热度按时间mf98qq941#
很明显,
Concurrent a
与Cont Action a
相同,其中Cont
是延续单子。下面是对延续的一个简单解释:1.考虑函数
f :: a -> b
,我们想把这个函数转换成延续传递风格,我们该怎么做呢?1.假设我们有一个延续
k :: b -> r
,它把f
的返回值作为输入,并且它本身返回一个任意类型的值r
,然后我们可以把f
转换成CPS。1.令
g :: a -> (b -> r) -> r
是f
的CPS版本函数。注意,它接受一个额外的参数(即,延续k
),并返回k
应用于其输出b
的结果。让我们举一个实际的例子,其中
f
是 predicate 函数odd :: Int -> Bool
:下面是以延续传递方式编写的同一个函数:
(Bool -> r) -> r
部分可以抽象为延续单子:注意,对于任意类型的
r
,延续k
的类型是Bool -> r
。因此,延续k
可以是任何以Bool
为参数的函数。例如:然而,在
Concurrent
的情况下,这个r
不是任意的。它已经被专门化为Action
。实际上,我们可以将Concurrent
定义为Cont Action
的类型同义词,如下所示:现在,我们不需要实现
Concurrent
的Monad
示例,因为它与上面定义的Cont r
的Monad
示例相同。注意,在
instance Monad Concurrent
的定义中,我们没有使用Action
,这是因为Concurrent = Cont Action
和Cont r
的monad示例透明地使用r
。wr98u20j2#
You seem to be reaching for some vocabulary, which is a hard question to phrase. Let's break down what you have into steps, and see if that helps.
Action
is an algebraic data type with three constructors. It is a corecursive data type as it is defined in terms of itself.Continuation a
is a type alias for the function typea -> Action
. It is an example of acontravariant functor
, since we could define a functionNote the reversal -
contramap
takes a functiona -> b
and creates a functionContinuation b -> Continuation a
.ContinuationPseudoMonad a
is another type alias for a function type, but sinceContinuation a
is also a function type,ContinuationPseudoMonad a
is a type of higher-order function, since it takes a function as an argument.ContinuationPseudoMonad a
is also a functor, but it's a covariant functor, as we could define a function