缩短/使功能更简洁

时间:2013-03-21 06:10:01

标签: haskell functional-programming where-clause

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),但我不能因为高清被宣布在上面。

我觉得在Haskell中有一个合适的方法,考虑到它有多懒,但我不知道在哪里看。

1 个答案:

答案 0 :(得分: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