1
flushPoints :: [Card] -> Integer
flushPoints cs@(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 中会有一种适当的方法,但我不确定在哪里看。

4

1 回答 1

8

这正是标准max函数所做的:它选择更大的值。因此,您可以将代码重写为:

flushPoints cs@(c1:hd) = max (flushPointsCalc True  (suitCount hd)) 
                             (flushPointsCalc False (suitCount cs))

如果您只是想知道如何为 指定本地名称flshPointsCalc True (suitCound hd),您确实可以使用where子句:

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

cs@(c1:hd)模式在函数where下方的块的范围内flushPoints,因此您可以hd在其中访问。

于 2013-03-21T06:18:52.660 回答