Elixir模式匹配中匹配Range的疑惑

发布于 2022-09-06 23:51:28 字数 785 浏览 23 评论 0

我的疑惑在于这两个函数中的Range匹配

我测试如下代码是可以执行的(分段查找):

defmodule Chop do
  def guess(actual, range = low..high) do
    guess = div(low+high, 2)
    IO.puts "Is it #{guess}?"
    _guess(actual, guess, range)
  end

  defp _guess(actual, actual, _),
    do: IO.puts "Yes, it's #{actual}"

  defp _guess(actual, guess, _low..high)
      when guess < actual,
    do: guess(actual, guess+1..high)

  defp _guess(actual, guess, low.._high)
      when guess > actual,
    do: guess(actual, low..guess-1)
end
Chop.guess(271, 1..1000)
"""
Is it 500?
Is it 250?
Is it 375?
Is it 312?
Is it 281?
Is it 265?
Is it 273?
Is it 269?
Is it 271?
Yes, it's 271
"""

不懂 _low..high 和 low.._high 是如何执行匹配的,比如传入区间 1..50,
匹配效果是不一样的吗?求解答,非常感谢?。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

空名 2022-09-13 23:51:28

That's easy. 我給你翻譯下這段歌詞:

defmodule Chop do
  def guess(actual, range = low..high) do
    guess = div(low+high, 2)
    IO.puts "Is it #{guess}?"
    _guess(actual, guess, range)
  end
  
  defp _guess(actual, guess, low..high) do
      cond  do
      guess == actual         -> IO.puts "Yes, it's #{actual}"
      guess < actual -> guess(actual, guess+1..high)
      guess > actual -> guess(actual, low..guess-1)
     
    end
  end
end
Chop.guess(271, 1..1000)

這個程式在邏輯上是等價的, 雖然一個是條件語句, 一個是pattern matching.

其實

  defp _guess(actual, actual, _),
    do: IO.puts "Yes, it's #{actual}"

  defp _guess(actual, guess, _low..high)
      when guess < actual,
    do: guess(actual, guess+1..high)

  defp _guess(actual, guess, low.._high)
      when guess > actual,
    do: guess(actual, low..guess-1)

它就是一個pattern matching, 只是你需要意識到把guess > actual, guess > actual, 以及其它任意情況(在這裏就只剩下相等啦)是作爲match的條件而存在的.

你也可以自己改寫成另一種pattern matching, 即case guess do形式, 這兩者是完全等價的, 只是看自己的品味, 窩寫standard ml的時候更喜歡case哈.

可能你對pattern matching還不熟悉, 多寫寫就行啦, elixir的精華之一是pattern matching, 你以後可以儘可能的用patter matching, 有些時候會比較燒腦, 比起定義本地變量(典型的如sml中的let in)也可能會效率低些(因爲很多情況會以無法使用尾遞歸爲代價), 但是會非常簡潔, 非常具有美感, 好好發現elixir的美吧, 掃年, functional programming的大門在等着你打開

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文