有可能在Clojure的Haskell做读者单子吗?
我已经看过了文档和文档。我也读过monad的博客,作者是,和 我能在Clojure中找到的读者Monad的唯一参考是有可能在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]
我的问题是:是否可以在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中的单子或单子