minimax :: Ord val => (pos -> val) -> (pos -> [pos]) -> Int -> Bool -> pos -> val minimax val nexts = mm where mm d player1 p = if d == 0 then val p else case nexts p of [] -> val p ps -> let vs = map (mm (d-1) (not player1)) ps in if player1 then maximum vs else minimum vs