【发布时间】:2016-02-08 16:27:42
【问题描述】:
让我们看看文档中的示例:
square = fn(x) -> x * x end
list = [1, 2, 3, 4]
Enum.map(list, square)
为什么需要显式写Enum.map?为什么它不使用简洁的符号map [1, 2, 3, 4], square?
Elixir 有多个调度和协议,但在我看来,它的使用有点奇怪。
如果您考虑 OOP 中的多态性或 FP 中的多方法/多分派、协议,重点是使代码简短明了,并让程序员不必记住方法的来源。
因此,在 OOP 中,代码如下所示:
list.map(square)
在 FP 多方法中它看起来像
map(list, square)
在这两种情况下,编译器/解释器都使用参数类型来确定它应该使用什么map 方法。
为什么 Elixir 不使用相同的方法?为什么它需要编写冗长的代码并将决定函数来自何处的责任放在程序员的肩上?
有时不使用多方法并明确指定它是有意义的,例如HttpServer.start(80)。但是对于像each、get、set、size 等一般方法,在没有明确指定它的来源的情况下使用它似乎要容易得多。
附:
Elixir 中的 Protocols 似乎实际上可以做到这一点。我想知道-为什么不使用它?我在 GitHub 上看到的 Elixir 项目中的所有代码都使用冗长的符号,例如 ModuleName.fnName。不知道为什么会这样。是否不鼓励使用协议,或者过于复杂而无法在日常任务中使用?
【问题讨论】:
-
我相信没有人愿意为了生存而编写协议实现。如果您确切知道您的数据是列表 - 您编写列表。
-
这是一个相当广泛的问题。投票结束。
-
请注意,这不是 OOP。命名空间的工作方式、合法传递的内容、存在的数据原语、消息和函数/方法调用之间的明显区别以及even the basic unit of computation 都完全不同。
标签: functional-programming protocols elixir multimethod