更改其正文中的函数参数值

时间:2016-03-13 05:03:30

标签: functional-programming elixir

为什么我仍然允许这样做?

  @spec url_hash(String.t) :: String.t
  def url_hash(url) do
    url = String.replace(url, ~r/\s/, "")
    Base.encode16(:crypto.hash(:md5, url), case: :lower)
  end

而不是我认为正确的函数式编程范式?

  @spec url_hash2(String.t) :: String.t
  def url_hash2(url) do
    url_copy = String.replace(url, ~r/\s/, "")
    Base.encode16(:crypto.hash(:md5, url_copy), case: :lower)
  end

如您所见,我正在修改函数体内的参数值。

1 个答案:

答案 0 :(得分:-1)

纯函数式语言不会让你这样做,甚至还有一些像Erlang这样不纯的函数式语言。 Erlang中的约定是使代码等效于此:

def url_hash(url) do
  url1 = some_func(url)
  url2 = some_other_func(url1)
  url3 = yet_another_func(url2)
  url3
end

问题是,当您这样做时,重新排序或添加新代码行会非常痛苦。出于这个原因,何塞决定允许变量重新分配。但是,原始url字符串未经修改 - 您只需更改哪个字符串url指向。