2016-09-29 24 views
0

我剛開始用Scala學習FP,所以對這個問題表示歉意。我發現這個練習(練習3.1 https://www.scala-exercises.org/fp_in_scala/functional_data_structures)進行模式匹配,但我有點混淆視聽,有鬧明白是怎麼來的X結果是3FP模式匹配

val x = List(1, 2, 3, 4, 5) match { 
    case Cons(x, Cons(2, Cons(4, _))) => x 
    case Nil => 42 
    case Cons(x, Cons(y, Cons(3, Cons(4, _)))) => x + y 
    case Cons(h, t) => h + sum(t) 
    case _ => 101 
} 

可以請一些與調試通過此方案的步驟幫助這裏步 ?我相信這會幫助我理解這個概念。

謝謝。

+0

謝謝大家。現在很清楚:-) – angus

回答

3

Scala中的不可變的ListCons -list。這意味着它由一系列Cons對象組成,並以Nil結尾。例如,您的列表:

List(1, 2, 3, 4, 5) 

會是這樣Cons -list:

Cons(1, Cons(2, Cons(3, Cons(4, Cons(5, Nil))))) 

當Scala中列出了模式匹配,你可以使用這個Cons - 結構。這就是那個例子所做的。

讓我去通過每個圖案的告訴你他們在做什麼:

  1. 如果你的第二個元素是2和第三個元素是4。如果是這樣的話這一個相匹配,該表達式返回列表的第一個元素。 _意味着你忽略列表的其餘部分(所以它可能是3個或更多元素)。

    case Cons(x, Cons(2, Cons(4, _))) => x 
    
  2. 這一個匹配空的列表。如果匹配,則表達式返回42.

    case Nil => 42 
    
  3. 這一個,如果你的第三元件是3和你的第四個要素是4.如果它匹配,則表達式返回列表的兩個第一元素的總和相匹配。

    case Cons(x, Cons(y, Cons(3, Cons(4, _)))) => x + y 
    
  4. 這一個匹配所有列表至少有一個元素。如果匹配,則表達式返回第一個元素加上列表其餘元素的總和(基本上等於整個列表的總和)。

    case Cons(h, t) => h + sum(t) 
    
  5. 這一個匹配一切。這是默認情況,並返回101.這絕不應該發生,因爲所有其他情況都在上面覆蓋。

    case _ => 101 
    

正如你希望現在可以看到的,x值變爲3,因爲它與第三種情況相匹配。這返回1 + 2,等於3.

+1

非常感謝你的很好的解釋 – angus

1

List(1, 2, 3, 4, 5)匹配模式Cons(x, Cons(y, Cons(3, Cons(4, _))))

這裏x對應於1y對應於圖2,3和4是在適當位置,而忽略最後ELEM。

所以x + y = 1 + 2

說明

列表不匹配第一圖案(Cons(x, Cons(2, Cons(4, _))))因爲後2圖案具有4

列表不匹配是Nil秒圖案因爲列表不是無

列表匹配第三種模式

作爲一個模式匹配...其他情況不匹配。因此模式匹配在第三種情況(即成功匹配)後停止匹配

0

列表(1,2,3,4,5)等於Cons(1,Cons(2,Cons(3,Cons(4,Cons 5,無))))。

val x = List(1, 2, 3, 4, 5) match { 
     case Cons(x, Cons(2, Cons(4, _))) => x //1 
     case Nil => 42 //2 
     case Cons(x, Cons(y, Cons(3, Cons(4, _)))) => x + y //3 
     case Cons(h, t) => h + sum(t) //4 
     case _ => 101 //5 
} 

「_」字表示「不關心」

,瞭解這一點很重要的是供應模式將影響結果的第一場比賽。

  1. 不能,因爲它的缺點(2,缺點(,缺點(4,....)))
  2. 不能,因爲它不是零,這是缺點
  3. 這是因爲供給X可以等於1,ÿ等於2的圖案其餘的繼續。當他看到「_」字,他不在乎什麼,他看到這意味着它提供
0

正如您可以通過名稱pattern-matching猜測的那樣,case中提供的整個表達式被視爲Pattern,並與匹配的值匹配。

在這種情況下,您的匹配值是List(1, 2, 3, 4, 5)。並且列表還可以使用infix cons-::(或postfix cons-Cons)來表示。

所以這個列表可以表示爲(使用infix cons),

1 :: 2 :: 3 :: 4 :: 5 :: Nil 

或者也可以(使用postfix cons),

Cons(1, Cons(2, Cons(3, Cons(4, Cons(5, Nil))))` 

,因此你可以看到,它的模式Cons(x, Cons(y, Cons(3, Cons(4, _))))相匹配,因此x被匹配到值1y至值2,其使得結果x + y3

0

該列表與第三種情況相匹配,所以這就是您正在查看的內容。兩個「列表」中的模式是相同的。因此,第三種情況將產生x + y的結果,在這種情況下爲3.要看到這一點,請回頭看看原始參數List(1, 2, 3, 4, 5)並觀察它與第三種情況的匹配程度; x = 1y = 2;所以x + y = 3