问题标签 [multimethod]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
264 浏览

macros - 当协议调用表单包含时,core.async go 块无法编译

go当我偶然发现一个奇怪的编译错误时,我正在实现一个涉及 core.async 块的函数:

我做了一些实验来尝试解决这个问题,发现它非常通用。假设我有任何协议MyProtocol

以下代码将无法编译,除了我在上面向您展示的异常之外:

但是,以下 2 将编译没有任何问题:

显然,这与在clojure.core.async.impl.ioc-macros-item-to-ssa命名空间中可以找到的多方法有关 。

在我看来,“<!内部协议方法调用表单”是go宏无法处理的情况。

有人对此有解释吗?我应该提交错误吗?


这发生使用[org.clojure/core.async "0.1.346.0-17112a-alpha"]and both [org.clojure/clojure "1.7.0-alpha1"]and [org.clojure/clojure "1.6.0"]

仅供参考,这发生在我实现一个 Ring 类型的中间件以结合 http-kit 异步 Web 服务器和 core.async 时。


为什么 Java 8 中的接口允许有 main 方法?

main为什么接口允许在 Java 8中有方法?

如下面的代码所述,它工作正常并正确产生输出。

目前它的行为就像一个类,我已经interface使用 main 方法执行了。

我们为什么需要这个?

0 投票
1 回答
282 浏览

clojure - CLojure:高阶函数 vs 协议 vs 多方法

有很多协议与多方法比较,但为什么不使用高阶函数呢?让我们举个例子:我们有一些数据(例如记录)。我们有方法serializedeserialize。假设我们要将其保存到文件、json 和数据库中。我们是否应该创建名为SerializationMethod的协议和名为databasejson文件的记录来实现它们?仅使用协议创建记录看起来有点骇人听闻。第二种解决方案 - 多方法 - 可以采用带有序列化输出的字符串参数并决定如何执行此操作。但我不确定这是正确的方法......第三种方法是编写函数序列化然后传递数据和序列化函数。但现在我不能用相同的名称命名序列化和反序列化方法(json fo 示例):

问题是我该如何(或应该如何)做到这一点。有没有更高阶函数的更通用的方法?或者,也许我不太了解某些东西?这是我使用clojure的第一步,所以请宽容。

0 投票
1 回答
389 浏览

clojure - Clojure 中的惯用表达简化

这篇优秀文章的启发,我想使用文章中使用的算法在 Clojure 中实现一个简单的表达式简化器。这篇文章给出了 F#、Scala、Haskell、C++ 和 Julia 中的示例实现,它们看起来都相当优雅。

我提出了两种不同的实现(见下文),但我有一种唠叨的感觉,它们都不是惯用的。

我的问题是:惯用的 Clojure 实现会是什么样子?

第一个实现,主要基于协议:

第二个实现,主要基于多方法,比第一个更详细:

0 投票
1 回答
1544 浏览

julia - Julia 是如何实现多方法的?

我一直在阅读http://c2.com/cgi/wiki?ImplementingMultipleDispatch

我一直在寻找有关 Julia 如何实现多方法的参考资料时遇到了一些麻烦。调度的运行时复杂度是多少,它是如何实现的?

0 投票
4 回答
1203 浏览

functional-programming - 为什么 Elixir 不使用多方法/协议?

让我们看一下文档中的示例:

为什么需要明确地写Enum.map?为什么它不使用干净和简短的符号map [1, 2, 3, 4], square

Elixir 有多种调度和协议,但在我看来,它的使用有点奇怪。

如果您考虑 OOP 中的多态性或 FP 中的多方法/多分派、协议,那么重点是使代码简短明了,并使程序员无需记住方法的来源。

因此,在 OOP 中,它看起来像下面的代码:

在 FP 多方法中,它看起来像

在这两种情况下,编译器/解释器都使用参数的类型来确定map它应该使用什么方法。

为什么 Elixir 不使用相同的方法?为什么它需要编写冗长的代码并将决定函数来自何处的责任放在程序员的肩上?

有时不使用 multi 方法并明确指定它是有意义的,例如HttpServer.start(80). 但是对于像each, get,等一般方法来说setsize在没有明确指定它的来源的情况下使用它似乎要容易得多。

附言

似乎使用 Elixir 中的协议实际上可以做到这一点。我想知道-为什么不使用它?我在 GitHub 上看到的 Elixir 项目中的所有代码都使用冗长的符号,例如ModuleName.fnName. 不知道为什么会这样。是否不鼓励使用协议,或者过于复杂而无法在日常任务中使用?

0 投票
3 回答
203 浏览

prolog - 通过 OO Prolog 中的多方法碰撞恒星物体?

我想知道如何在 Prolog 中结合统一和 OO。我想在术语对象上实现多方法调度。

如果没有术语对象和简单术语,我将执行以下操作,并且可以从多参数索引中受益:

但上面只给出了精确的类型匹配。

如果我想要一个子类类型匹配,我应该怎么做(可能还有更多的宇宙飞船子类,如 excelsior、galaxy 等。在案例 2,3 和 4 中也应该匹配)。

我还能使用统一和索引吗?

再见

PS:示例来自这里,它没有 Prolog 解决方案:
https ://en.wikipedia.org/wiki/Multiple_dispatch

0 投票
1 回答
85 浏览

clojure - 输入验证是 Clojure 中多方法的合理用例吗?

在关于多方法的clojure.org 文档中,它指出:

Clojure multimethods ... can do validation of arguments and route to error-handling methods etc.

但是,我没有看到很多人为此目的使用多方法的例子。在我只需要实现单个方法定义的情况下,使用多方法进行输入验证是否仍然有意义?例如:

这样做的好处是它保持了divide输入检查或错误处理的最终实现。是否有更惯用的方式来获得验证、错误处理和干净的语法?

0 投票
1 回答
582 浏览

clojure - Clojure 定义多方法以及如何传递参数

我似乎很难理解下面的代码是如何工作的。更准确地说,定义的函数如何处理传递的参数

为什么[x y] [(:role x) (:role y)]在定义“遭遇”时我们有 2 个向量 ( )。这是否意味着该函数采用向量参数?如果是这样,为什么我必须像这样调用函数:

(encounter {:role :manager} {:role :boss})

上面的调用不是将第一个 hashmap 传递给 [xy],第二个传递给 [(:role x) (:role y)])。我只是不明白x是如何获得值的:manager 和y是如何获得 :boss 的值的。

上面的例子来自这里:https ://yogthos.github.io/ClojureDistilled.html

0 投票
3 回答
1898 浏览

interface - Nim - 创建实现方法的对象序列

我想编写一个游戏,并想为多个实体使用组件模式。

在具有接口/类型类/多重继承的语言中不会有问题。

我希望某些实体是可更新的但不可渲染的,而有些则两者兼而有之。


哈斯克尔:

我可以创建一个可以更新的列表。

在 Java/D/... 这可以通过接口实现


现在我想知道如何使用多种方法在 nim 中实现这一点。

拟合多方法的存在可以用类型表示吗?



编辑:添加了更多代码并修复了不正确的 Haskell 示例

0 投票
1 回答
381 浏览

java - 按类型分派的 Clojure 多方法

我在clojure中实现了快速功率算法:

现在我想玩类型提示和 java 互操作。我想这样做是因为更好地理解 clojure 中的所有这些“java 东西”。看起来他们很容易,但实际上有很多隐藏的障碍。所以,我写道:

当然它甚至没有编译,因为错误的arity问题。所以我用谷歌搜索了如何通过 clojure 中的类型进行调度并找到multimethods. 其实在这一点上我是很天真和兴奋的,我从来没有尝试multimethods过,所以,我写了一些类似的东西:

事情变得有点复杂。这很好用,但我想知道是否有一种更简洁的方法来处理类型重载之类的事情。我不明白为什么在 clojure 中我不能这样做,即使在 Java 中我可以。

PS:当然我可以“隐藏”基于java.math.BigInteger嵌套函数内部的逻辑,并从外部函数调用它fast-pow,但实际上 - 这对我来说并不有趣,我很确定,这个问题可以通过使用来解决multimethods。如果我错了或遗漏了什么 - 请向我解释.. ;)