有可能在Clojure的Haskell做读者单子吗?

有可能在Clojure的Haskell做读者单子吗?,clojure,monads,reader-monad,Clojure,Monads,Reader Monad,我已经看过了文档和文档。我也读过monad的博客,作者是,和 我能在Clojure中找到的读者Monad的唯一参考是 我的问题是:是否可以在Clojure中执行此操作?您可以提供一个示例吗?当然可以。Reader只是一个函数,它接受一个环境并从中提取一些值 使用Reader,m-result获取一些值并生成忽略环境并返回该值的读取器: (defn reader-result [value] "Ignores environment, returns value" (fn [env]

我已经看过了文档和文档。我也读过monad的博客,作者是,和

我能在Clojure中找到的读者Monad的唯一参考是


我的问题是:是否可以在Clojure中执行此操作?您可以提供一个示例吗?

当然可以。
Reader
只是一个函数,它接受一个环境并从中提取一些值

使用
Reader
m-result
获取一些值并生成忽略环境并返回该值的读取器:

(defn reader-result
  [value]
  "Ignores environment, returns value"
  (fn [env]
    value))
m-bind
接受一个读卡器和一个函数
f
,该函数接受一个值并生成一个新的读卡器。然后,它组合这些参数以生成一个新的读卡器,该读卡器将初始读卡器应用于环境,将其生成的值提供给
f
以生成一个新的读卡器,然后将该读卡器应用于环境:

(defn reader-bind
  [reader f]
  "Applies reader to environment,
   then applies f to new environment"
  (fn [env]
    (let [read-value (reader env)]
      ((f read-value) env))))
(defn run-reader
  "Runs a reader against an environment,
   returns the resulting environment"
  [reader env]
  (reader env))
(defn ask
  "A reader that returns the environment"
  [env]
  env)

(defn asks
  "A reader that returns the result of
   f applied to the environment"
  [f]
  (fn [env]
    (f env)))
通过这些函数,我们可以使用
算法单子
定义
读取器

(m/defmonad Reader
          [m-result  reader-result
           m-bind    reader-bind])
有几个重要的辅助函数<代码>运行读取器获取读取器和环境,并将读取器应用于该环境:

(defn reader-bind
  [reader f]
  "Applies reader to environment,
   then applies f to new environment"
  (fn [env]
    (let [read-value (reader env)]
      ((f read-value) env))))
(defn run-reader
  "Runs a reader against an environment,
   returns the resulting environment"
  [reader env]
  (reader env))
(defn ask
  "A reader that returns the environment"
  [env]
  env)

(defn asks
  "A reader that returns the result of
   f applied to the environment"
  [f]
  (fn [env]
    (f env)))
因为我们的读取器只是函数,
运行读取器
并不是绝对必要的。但是,它可以使事情变得更清楚,使我们更接近Haskell实现,因此我们将继续使用它

ask
ask
让我们检查一下环境
ask
是返回环境的读取器<代码>询问获取选择器并创建将该选择器应用于环境的读取器:

(defn reader-bind
  [reader f]
  "Applies reader to environment,
   then applies f to new environment"
  (fn [env]
    (let [read-value (reader env)]
      ((f read-value) env))))
(defn run-reader
  "Runs a reader against an environment,
   returns the resulting environment"
  [reader env]
  (reader env))
(defn ask
  "A reader that returns the environment"
  [env]
  env)

(defn asks
  "A reader that returns the result of
   f applied to the environment"
  [f]
  (fn [env]
    (f env)))
这让我们有足够的时间来完成:

另一个重要的
Reader
功能是
local
。这将使用一个函数修改环境和读卡器,并创建一个新的读卡器,该读卡器在将环境传递给原始读卡器之前修改环境:

(defn local
  [modify reader]
  "A reader that modifies the environment
   before calling the original reader"
  (fn [env]
    (run-reader reader (modify env))))
有了这些,我们可以通过:


因此,这就是制作
阅读器所需的全部内容

以下单子有一些奇妙的例子:

  • clojure中的读者monad
  • 作家在《clojure》中独唱
  • clojure中的国家单子
  • clojure中的身份单子
  • clojure的monad
  • clojure中的单子或单子