我遇到過這個scala代碼,我試着弄清楚它做了什麼,除了事實上它返回一個int。我不確定這三行:解釋一些scala代碼 - 初學者
l match {
case h :: t =>
case _ => 0
功能:
def iterate(l: List[Int]): Int =
l match {
case h :: t =>
if (h > n) 0
case _ => 0
}
我遇到過這個scala代碼,我試着弄清楚它做了什麼,除了事實上它返回一個int。我不確定這三行:解釋一些scala代碼 - 初學者
l match {
case h :: t =>
case _ => 0
功能:
def iterate(l: List[Int]): Int =
l match {
case h :: t =>
if (h > n) 0
case _ => 0
}
首先,定義了一個名爲iterate
功能,您所指定的返回類型爲Int
。它具有類型List[Int]
的參數1,參數l
。
List
類型在整個函數式編程中都很突出,它的主要特點是它具有高效的前置,並且易於將任何List
分解成頭部和尾部。頭將是列表中的第一個元素(如果非空),尾部將是List
(本身是List
)的其餘部分 - 這對於在List
上運行的遞歸函數非常有用。
的match
被稱爲模式匹配。它本質上是在C-ISH語言switch
語句,但更強大 - 在switch
限制你常數(至少在C時一樣),但目前還沒有這樣的限制與match
。
現在,您的第一個case
您有h :: t
- ::
被稱爲「cons」,這是函數式編程的另一個術語。當您通過預先從另一個List
創建新的List
時,可以使用::
運算符來完成此操作。
實施例:
val oldList = List(1, 2, 3)
val newList = 0 :: oldList // newList == List(0, 1, 2, 3)
在Scala中,與一個:
結束操作符是真正的右手側的一個方法,所以0 :: oldList
是oldList.::(0)
等效 - 的0 :: oldList
是語法糖,使得它更容易讀。
我們可能已經定義oldList
像
val oldList = 1 :: 2 :: 3 :: Nil
其中Nil
表示空List
。打破這種分解成以下步驟:
3 :: Nil
首先計算,創建List(3)
其具有頭3和尾空的等效。List(3)
。List(2, 3)
的新列表。所得的List(1, 2, 3)
List
被分配給val oldList
。
現在,當您使用::
模式匹配你基本上是一個分解成List
頭部和尾巴,就像我們如何創建的List
上述相反。在這裏當你做
l match {
case h :: t => ...
}
你說如果可能分解l
成頭和尾。如果成功分解,則可以使用這些變量h
和t
來做任何你想做的事情。通常你會做類似於h
的行爲,並在t
上調用遞歸函數。
這裏有一點要注意的是,你的代碼將無法編譯..你做一個if (h > n) 0
但目前還沒有明確的else
所以會發生什麼是你的代碼看起來像這樣的編譯器:
if (h > n) 0
else { }
其中有鍵入AnyVal
(0
和「nothing」的常見超類型),違反了您的Int
保證 - 您將不得不添加具有某個失敗值的else
分支或其他內容。
第二個case _ =>
就像switch
中的default
,它捕獲任何在第一個case
中頭/尾分解失敗的東西。
您的代碼基本上做到這一點:
l
List
參數,看看它是否可以分解爲頭部和尾部。n
的變量。如果它比n
越大,函數返回0(您需要添加會發生什麼,如果它不是更大)感謝您的詳細解釋。 –
這被稱爲模式匹配。這就像一個switch
聲明,但更強大。
一些有用的資源:
http://www.scala-lang.org/node/120
http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-4
去通過斯卡拉之旅HTTP ://www.scala-lang.org/node/120。另外,http://www.artima.com/scalazine/articles/pattern_matching.html –
您的代碼不應該編譯,因爲'if(h> n)0'不是'Int'類型(缺少其他類型爲'Int'的情況')和'n'是未知的。 –
'head :: tail'模式匹配列表。對於'List(1,2,3)'它是'1 :: List(2,3)',對於'List(1)'它是'1 :: List()'(或'1 :: Nil' ),對於List(),它不匹配。 「_」與「其他」匹配。 – ron