2013-03-21 79 views
1
flushPoints :: [Card] -> Integer 
flushPoints [email protected](c1:hd) = 
    if flushPointsCalc True (suitCount hd) > 
     flushPointsCalc False (suitCount cs) 
    then flushPointsCalc True (suitCount hd) 
    else flushPointsCalc False (suitCount cs) 

讓我們說,如果我有一個功能,如上面的一個,我將如何去縮短它?縮短/製作功能更簡潔

我正在考慮做一個where hdFlush = flushPointsCalc True (suitCount hd)但我不能從hd上面聲明。

我覺得在Haskell中會有一種合適的方式來做它,考慮它有多懶,但我不確定在哪裏尋找。

回答

8

這正是標準max函數所做的:它選擇較大的值。所以,你可以重寫你的代碼爲:

flushPoints [email protected](c1:hd) = max (flushPointsCalc True (suitCount hd)) 
          (flushPointsCalc False (suitCount cs)) 

如果你只是想知道如何爲flshPointsCalc True (suitCound hd)提供本地名稱,你可以確實使用where條款:

flushPoints :: [Card] -> Integer 
flushPoints [email protected](c1:hd) = 
    if hdFlush > csFlush then hdFlush else csFlush 
    where hdFlush = flushPointsCalc True (suitCount hd) 
     csFlush = flushPointsCalc False (suitCount cs) 

[email protected](c1:hd)模式位於flushPoints函數下的where塊的範圍內,因此您可以在其中訪問hd

+0

啊,我正在使用最大的,由於某種原因它沒有工作。但我可能在某個地方錯過了一個支架。 – rlhh 2013-03-21 06:22:09

+1

@ user1043625:「最大」和「最大」是不同的功能。 「最大」給你一個列表中最大的元素,其中'max'給你兩個參數中較大的一個。你可以通過查看他們的類型簽名來看到差異。 – 2013-03-21 06:24:29

+0

好吧,我不知道有兩個不同的功能(最大和最大),並感謝進一步的澄清。 :d – rlhh 2013-03-21 06:25:57