Racket 如何实施";功能“;使用函数';s数据/单子模块?
由于data/monad模块的do表示法在结构上运行,我如何定义作为函数的monad类型,例如解析器 我已经习惯了OCaml,在那里我的monad大概会有以下签名:Racket 如何实施";功能“;使用函数';s数据/单子模块?,racket,Racket,由于data/monad模块的do表示法在结构上运行,我如何定义作为函数的monad类型,例如解析器 我已经习惯了OCaml,在那里我的monad大概会有以下签名: 模块类型解析器=sig 类型state=string*int 键入'at=state->(('a*state),string)Result.t val return:'a->'a t val bind:'a t->('a->'b t)->'b t 结束 很抱歉在OCaml中发布一个例子,我的球拍能力目前还不是很好 这种monad与
模块类型解析器=sig
类型state=string*int
键入'at=state->(('a*state),string)Result.t
val return:'a->'a t
val bind:'a t->('a->'b t)->'b t
结束
很抱歉在OCaml中发布一个例子,我的球拍能力目前还不是很好
这种monad与data/monad兼容吗,或者我应该看看另一种解决方案吗?没有什么可以阻止您将函数包装到结构中,然后在该结构上实现
gen:monad
接口。是一个使用该技术实现一元解析器组合器库的示例。具体来看:
(结构分析器(proc)
#:方法gen:functor
[(定义/通用-映射)
(定义(映射f p)
(解析器(编写(匹配lambda[(已消耗(ok v rest消息))(已消耗(ok(-map f v)rest消息)))
[(空(ok v rest消息))(空(ok(-map f v)rest消息))]
[错误])
(解析器程序p))]
#:方法gen:适用
[(定义(纯x)
(纯/便士)
(定义(应用p ps)
(做[f]
(struct parser (proc)
#:methods gen:functor
[(define/generic -map map)
(define (map f p)
(parser (compose (match-lambda [(consumed (ok v rest message)) (consumed (ok (-map f v) rest message))]
[(empty (ok v rest message)) (empty (ok (-map f v) rest message))]
[error error])
(parser-proc p))))]
#:methods gen:applicative
[(define (pure _ x)
(pure/p x))
(define (apply p ps)
(do [f <- p]
[xs <- (map/m values ps)]
(d:pure (r:apply f xs))))]
#:methods gen:monad
[(define (chain f p)
(parser
(λ (input)
(match (parse p input)
[(empty (ok (and foo (syntax-box x _)) rest message))
(match (parse (f x) rest)
[(empty reply) (empty (merge-message/reply message reply))]
[consumed consumed])]
[(consumed (ok (and foo (syntax-box x srcloc)) rest message))
(consumed (match (parse (f x) rest)
[(consumed (ok stx rest message))
(ok (merge-syntax-box/srcloc stx srcloc) rest message)]
[(empty (ok (syntax-box datum _) rest message))
(merge-message/reply message (ok (syntax-box datum srcloc) rest message))]
[(consumed error) error]
[(empty error) (merge-message/reply message error)]))]
[error error]))))])