gpt4 book ai didi

clojure - 这个 do-monad 可以用 let block 代替吗?

转载 作者:行者123 更新时间:2023-12-02 03:28:21 25 4
gpt4 key购买 nike

author here provides以下示例使用 do-monad 来组合测试生成器:

(require '[clojure.test.check.generators :as gen])
(require '[clojure.algo.monads :as m])
(m/defmonad gen-m
[m-bind gen/bind
m-result gen/return])

(def vector-and-elem
(m/domonad gen-m
[n (gen/choose 1 10)
v (gen/vector gen/int n)
e (gen/element v)]
[v, e]))

(gen/sample vector-and-elem)
([[0 -1 1 0 -1 0 -1 1] 0]
[[1 1 3 3 3 -1 0 -2 2] 3]
[[8 4] 8]...

commentator here asserts这是 monad 的一个很好的例子,不仅仅是为了它们本身,而是为了提供真正的增值。

对我来说,这似乎与 let-block 所做的没有什么不同。确实 - Brian Marick here compares the do-monad 到 let block 。

我的问题是:这个 do-monad 可以用 let block 代替吗?

最佳答案

test.check 的上下文中,答案是no,这个 do-monad 不能被 代替让阻止。但是您可以像这样手动使用 gen/bindgen/return:

(def vector-and-elem
(gen/bind (gen/choose 1 10)
(fn [n]
(gen/bind (gen/vector gen/int n)
(fn [v]
(gen/bind (gen/elements v)
(fn [e]
(gen/return [v e]))))))))

这就是 Monad 在幕后为您做的事情。

试图把它写成一个let:

(def vector-and-elem-let
(let [n (gen/choose 1 10)
v (gen/vector gen/int n)
e (gen/elements v)]
[v e]))

不起作用,因为函数:choosevectorelements 返回的是 generator 而不是生成器 的结果。因此,例如 gen/vector 期望 Integer 作为第二个参数而不是 generator 而这个 let 不会甚至编译。

关于clojure - 这个 do-monad 可以用 let block 代替吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28961373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com