Haskell 连续抽象
在基于此的并发性的一般练习中 我们有:Haskell 连续抽象,haskell,abstraction,Haskell,Abstraction,在基于此的并发性的一般练习中 我们有: -- 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
-- 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)
因此,并发a
是一个单子,我们必须使用它的两个强制性法律,return和bind来实现
不幸的是,我找不到足够的词汇来更精确地定义ContinuationPseudoMonad这件事。。。如果我缺乏语言,我的头脑中就缺乏抽象
你怎么称呼它
有没有一个词的意思是Continuation a->Action
而不是我那笨拙的、毫无意义的Continuation假单胞菌
行动是:
data Action = Atom (IO Action)
| Fork Action Action
| Stop
你似乎在学习一些词汇,这是一个很难表达的问题。让我们把你所拥有的分解成几个步骤,看看这是否有帮助
data Action = Atom (IO Action)
| Fork Action Action
| Stop
Action
是一种代数数据类型,具有三个构造函数。它是一种corecursive数据类型,因为它是根据自身定义的
type Continuation a = a -> Action
延续a
是函数类型a->Action
的类型别名。这是一个反变函子的例子,因为我们可以定义一个函数
contramap :: (a -> b) -> Continuation b -> Continuation a
contramap aToB bToAction = aToAction
where aToAction = \a -> bToAction (aToB a)
fmap :: (a -> b) -> ContinuationPseudoMonad a -> ContinuationPseudoMonad b
fmap aToB aToActionToAction = bToActionToAction
where bToActionToAction = \bToAction -> aToActionToAction (\a -> bToAction (aToB a))
注意,反转-contracemap
采用函数a->b
,并创建函数Continuation b->Continuation a
type ContinuationPseudoMonad a = Continuation a -> Action
ContinuationPseudoMonad a
是函数类型的另一种类型别名,但由于Continuation a
也是一种函数类型,ContinuationPseudoMonad a
是一种高阶函数,因为它将函数作为参数
ContinuationPseudoMonad a
也是一个函子,但它是一个协变函子,因为我们可以定义一个函数
contramap :: (a -> b) -> Continuation b -> Continuation a
contramap aToB bToAction = aToAction
where aToAction = \a -> bToAction (aToB a)
fmap :: (a -> b) -> ContinuationPseudoMonad a -> ContinuationPseudoMonad b
fmap aToB aToActionToAction = bToActionToAction
where bToActionToAction = \bToAction -> aToActionToAction (\a -> bToAction (aToB a))
你似乎在学习一些词汇,这是一个很难表达的问题。让我们把你所拥有的分解成几个步骤,看看这是否有帮助
data Action = Atom (IO Action)
| Fork Action Action
| Stop
Action
是一种代数数据类型,具有三个构造函数。它是一种corecursive数据类型,因为它是根据自身定义的
type Continuation a = a -> Action
延续a
是函数类型a->Action
的类型别名。这是一个反变函子的例子,因为我们可以定义一个函数
contramap :: (a -> b) -> Continuation b -> Continuation a
contramap aToB bToAction = aToAction
where aToAction = \a -> bToAction (aToB a)
fmap :: (a -> b) -> ContinuationPseudoMonad a -> ContinuationPseudoMonad b
fmap aToB aToActionToAction = bToActionToAction
where bToActionToAction = \bToAction -> aToActionToAction (\a -> bToAction (aToB a))
注意,反转-contracemap
采用函数a->b
,并创建函数Continuation b->Continuation a
type ContinuationPseudoMonad a = Continuation a -> Action
ContinuationPseudoMonad a
是函数类型的另一种类型别名,但由于Continuation a
也是一种函数类型,ContinuationPseudoMonad a
是一种高阶函数,因为它将函数作为参数
ContinuationPseudoMonad a
也是一个函子,但它是一个协变函子,因为我们可以定义一个函数
contramap :: (a -> b) -> Continuation b -> Continuation a
contramap aToB bToAction = aToAction
where aToAction = \a -> bToAction (aToB a)
fmap :: (a -> b) -> ContinuationPseudoMonad a -> ContinuationPseudoMonad b
fmap aToB aToActionToAction = bToActionToAction
where bToActionToAction = \bToAction -> aToActionToAction (\a -> bToAction (aToB a))
显然,
Concurrent a
与Cont Action a
相同,其中是continuation monad。下面是一个关于延续的简单解释:
a
和b
,请考虑函数f::a->b
。我们希望将此函数转换为连续传递样式。我们如何做到这一点k::b->r
,它将f
的返回值作为输入,并且自身返回任意类型的值r
。接下来,我们可以将f
转换为CPSg::a->(b->r)->r
成为f
的CPS版本函数。请注意,它接受一个附加参数(即continuationk
),并返回应用于其输出b
的k
的结果f
是谓词函数odd::Int->Bool
:
odd::Int->Bool
奇数n=n`mod`2==1
以下是以连续传递样式编写的相同函数:
odd'::Int->(Bool->r)->r
奇数'nk=k(n'mod'2==1)
(Bool->r)->r
部分可以抽象为延续单子:
datacontra=Cont{runCont::(a->r)->r}
奇数'::Int->Cont r Bool
奇数n=return(n`mod`2==1)
实例Monad(续)其中
返回a=Cont(\k->ka)
m>>=f=Cont(\k->runCont m(\a->runCont(fa)k))
注意,对于某些任意类型的r
,延续k
的类型是Bool->r
。因此,continuationk
可以是以Bool
为参数的任何函数。例如:
cont::Bool->IO()
cont=打印
main::IO()
主=奇数'21续
但是,在并发
的情况下,此r
不是任意的。它专门用于操作
。事实上,我们可以将Concurrent
定义为contaction
的类型同义词,如下所示:
type Concurrent=Cont Action
现在,我们不需要为Concurrent
实现Monad
实例,因为它与上面定义的contr
的Monad
实例相同
runConcurrent::Concurrent a->ContinuationPseudoMonad a
runConcurrent(Concurrent g)=g
实例Monad并发在哪里
返回a=Concurrent(\k->ka)
m>>=f=Concurrent(\k->runConcurrent m(\a->runConcurrent(fa)k))
请注意,在
实例Monad Concurrent
的定义中,我们没有使用操作
。这是因为Concurrent=contaction
和contr
的monad实例透明地使用r
。很明显Concurrent a
与contaction a
相同,其中是延续monad。下面是一个关于延续的简单解释:
a
和b
,请考虑函数f::a->b
。我们希望将此函数转换为连续传递样式。我们如何做到这一点k::b->r
,它接受f的返回值