Racket 如何实施";功能“;使用函数';s数据/单子模块?

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与

由于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与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]))))])