gpt4 book ai didi

clojure - 构造 Clojure defmulti/defmethod

转载 作者:行者123 更新时间:2023-12-04 23:28:32 24 4
gpt4 key购买 nike

我错过了关于 defmulti 和 defmethod 的重要一点。我已经阅读了几本书对 defmulti 的解释,但我仍然感到困惑。

我想获得一个随机值,具体取决于它是交易还是像 100.00 这样的金额

我想调用 (random-val) 并取回一个avail-trans值或随机小数。我已经尝试将这些函数放在 map 中,但我得到了相同的值,即avail-trans,a\B。

(def^:dynamic map-val {:trans (random-trans) :amt (random-amount)})

这是显示我正在做的事情不起作用的最少代码量。我将不胜感激任何指示或帮助。
(def^:dynamic avail-trans [\B \W \D \A])

(defn random-trans
[]
(nth avail-trans (.nextInt random (count avail-trans))))

(defn random-amount
[]
(float (/ (.nextInt random (count (range 1 10000))) 25 )))

以下内容构造不正确,但我不确定为什么或如何解决该问题:
(defmulti random-val :val-type)

(defmethod random-val :trans []
(random-trans))

(defmethod random-val :amt []
(random-amount))

调用 (random-val :trans)导致此错误:

java.lang.IllegalArgumentException:多方法'random-val'中没有用于调度值的方法:null(NO_SOURCE_FILE:0)

最佳答案

使用 defmulti 创建多方法;你做对了。 defmulti需要一个名称和一个调度函数(和一个文档字符串,加上一些选项,如果你愿意的话,但忘了那些)。

(defmulti random-val identity) 

当您使用 defmethod 实现多方法时,你需要指定你正在实现的多方法的名称,它应该匹配的调度值,然后是函数尾部(arglist 加上你想要它做的任何事情)。
(defmethod random-val :trans [t] (random-trans))
(defmethod random-val :amt [t] (random-amt))

你得到 java.lang.IllegalArgumentException: No method in multimethod 'random-val' for dispatch value: null (NO_SOURCE_FILE:0)因为当你分配的调度函数 random-val , :val-type应用于任何其他关键字,它会为您提供 null .当 Clojure 尝试查找与该调度值匹配的方法时,它会失败。

但即使它在那里没有失败,你定义的方法也有 0 arity(不接受任何值),所以你也需要修复它(在上面完成)。

最后,这似乎不是协议(protocol)的好用途。只需使用您的两个独立功能, random-amountrandom-trans .

还要注意, Clojure's website对多种方法有很好的解释。

关于clojure - 构造 Clojure defmulti/defmethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8545920/

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