2014-12-18 23 views
3

我有一個函數:如何根據特定的輸入模式匹配不同的方式?

closeTo61 :: Tactic 
closeTo61 s P2 h d e b 
    | cs + ps < 53 = 0 
    | cs + ps == 61 = 100 -- Best case 
    | numWaysToScoreN (61 - (cs + ps)) h b == 0 = 0 -- Worst case 
    | numWaysToScoreN (61 - (cs + ps)) h b == 1 = 50 -- Strong case 
    | numWaysToScoreN (61 - (cs + ps)) h b == 2 = 70 -- Very Strong case 
    | numWaysToScoreN (61 - (cs + ps)) h b >= 3 = 90 -- Extremely Strong case 
     where 
      ps = scoreDom d e b 
      (_,cs) = s 

closeTo61 s P1 h d e b 
    | cs + ps < 53 = 0 
    | cs + ps == 61 = 100 
    | numWaysToScoreN (61 - (cs + ps)) h b == 0 = 0 
    | numWaysToScoreN (61 - (cs + ps)) h b == 1 = 50 
    | numWaysToScoreN (61 - (cs + ps)) h b == 2 = 70 
    | numWaysToScoreN (61 - (cs + ps)) h b >= 3 = 90 
     where 
      ps = scoreDom d e b 
      (cs,_) = s 

我和兩個綁定這樣做的第二個參數的每一個可能的輸入的唯一原因是因爲在wherecs取決於該輸入模式匹配不同。

有沒有一種方法可以僅使用一個綁定並檢查where塊中的第二個輸入以使用正確的模式?

回答

2

您可以將模式匹配到where塊,可以定義cs

closeTo61 s p h d e b 
    ... 
    where cs = case p of P1 -> fst s; P2 -> snd s 

如果你這樣做了很多(和,因爲你P1P2定義的類型,你可能會),我想提取此邏輯爲更有意義的輔助功能:

component P1 (x, _) = x 
component P2 (_, x) = x 

然後,你可以做

closeTo61 s p h d e b 
    ... 
    where cs = component p s 
3

你可以做,而不是

closeTo61 s p h d e b 
    | cs + ps < 53 = 0 
    | ... 
    where 
     cs = chooseByP p s 
     chooseByP P1 = fst 
     chooseByP P2 = snd 

雖然,因爲你只用sp確定使用哪種s元素,爲什麼讓他們在這裏作爲單獨的參數?

closeTo61 cs h d e b 
    | ... 
    where 
     ps = scoreDom d e b 

closeTo61' s p = closeTo61 (chooseByP p s) 
相關問題