
Holger Siegel wrote:
loop alpha b (c:cs) = let alpha' = max(alpha, - negascout c d (-b) (-alpha)) in if alpha' >= beta then alpha' else if alpha' >= b then let alpha'' = - negascout c d (-beta) (-alpha') in if alpha'' >= beta then alpha'' else loop alpha'' (alpha'' + 1) cs else loop alpha' (alpha' + 1) cs loop alpha _ [] = alpha
Guard-izing and where-izing that for more clarity: > loop alpha _ [] = alpha > loop alpha b (c:cs) = result > where > alpha' = max(alpha, - negascout c d (-b) (-alpha)) > result > | alpha' >= beta = alpha' > | alpha' >= b = result' > | otherwise = loop alpha' (alpha' + 1) cs > where > result' > | alpha'' >= beta = alpha'' > | otherwise = loop alpha'' (alpha'' + 1) cs > where > alpha'' = - negascout c d (-beta) (-alpha') Which makes it obvious that the "result" function is something inlined into itself. Uninlining may make the code clearer still, or maybe not. -- Live well, ~wren