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 がいかに怠惰であるかを考えると、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 に答える