当前位置 : 主页 > 大数据 > 区块链 >

函数式编程 – 为什么Elixir不使用Multimethods / Protocols?

来源:互联网 收集:自由互联 发布时间:2021-06-22
让我们看一下docs中的示例: square = fn(x) - x * x endlist = [1, 2, 3, 4]Enum.map(list, square) 为什么需要显式编写Enum.map?为什么它不使用干净和短的符号图[1,2,3,4],方形? Elixir有多个Dispatch协议,但
让我们看一下docs中的示例:

square = fn(x) -> x * x end
list = [1, 2, 3, 4]
Enum.map(list, square)

为什么需要显式编写Enum.map?为什么它不使用干净和短的符号图[1,2,3,4],方形?

Elixir有多个Dispatch&协议,但对我来说,它有点奇怪地使用它.

如果你考虑OOP中的多态性或MultiModods / Multiple Dispatch,FP中的协议,重点是使代码简短,简洁,让程序员内存不再记住方法的来源.

所以,在OOP中它看起来像下面的代码:

list.map(square)

在FP多方法中它看起来像

map(list, square)

在这两种情况下,编译器/解释器都使用参数类型来确定它应该使用哪种映射方法.

为什么Elixir不使用相同的方法?为什么需要编写详细的代码并负责决定函数的来源在程序员的肩膀上?

有时候不使用多方法并明确指定它是有意义的,比如HttpServer.start(80).但对于像per,get,set,size等一般方法来说,如果没有明确指定它的来源,它似乎更容易使用它.

附:

似乎实际上可以使用Elixir中的Protocols来实现.我想知道 – 为什么不使用它?我在GitHub上看到的Elixir项目中的所有代码都使用了冗长的详细符号,如ModuleName.fnName.不知道为什么会这样.协议的使用是否不鼓励,或者太复杂,无法在日常任务中使用?

您可以以可扩展的方式使用具有不同参数的Enum.map,因为它是使用协议实现的:

iex> Enum.map [1, 2, 3], fn x -> x * x end
[1, 4, 9]

iex> Enum.map 1..3, fn x -> x * x end
[1, 4, 9]

只要导入Enum模块,您也可以将Enum.map写为map:

iex> import Enum
iex> map [1, 2, 3], fn x -> x * x end
[1, 4, 9]

我们默认情况下不包含Enum模块.显式导入它要好得多,这样任何阅读代码的人都可以更好地了解所使用的函数来自何处.

换句话说,多个调度和协议仍然不会改变代码始终存在于模块内的事实,并且除非导入,否则调用始终是合格的.

网友评论