为什么我仍然允许这样做?
@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
如您所见,我正在修改函数体内的参数值。
答案 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
指向。