On Fri, Aug 21, 2015 at 03:31:14AM +0300, Oleg Ponomarev wrote:
> Exclude components which are equal to zero from the computation sum
> on compile time by using Maybe monad to wrap optimal value computation
> function.
> 
> Signed-off-by: Oleg Ponomarev <[email protected]>
> ---
>  src/Ganeti/HTools/Cluster/MetricsComponents.hs | 17 ++++-------------
>  src/Ganeti/HTools/Cluster/MetricsTH.hs         | 17 ++++++++++++-----
>  2 files changed, 16 insertions(+), 18 deletions(-)
> -  let comp c = appE (optimalValue c) $ varE nl
> -      stat = appE [| sum :: [Double] -> Double |] . listE $ map comp 
> components
> +  let stat = foldl (addVal nl) [| 0 :: Double |] $ map optimalValue 
> components
>        fname = mkName "optimalCVScore"
>    sig_d <- sigD fname ((arrowT `appT` [t| Node.List |]) `appT` [t| Double |])
>    fun_d <- funD fname [clause [varP nl] (normalB stat) []]
>    return [sig_d, fun_d]
> +  where
> +    addVal :: Name -> ExpQ -> Maybe ExpQ -> ExpQ
> +    addVal nl cur (Just f) = appTwice [| (+) :: Double -> Double -> Double |]
> +                                      cur . appE f $ varE nl
> +    addVal _ cur Nothing = cur

The addVal basically filters out the the Just values; I think the code
would be slightly more readable if you have

  +  let stat = foldl (addVal nl) [| 0 :: Double |] $ mapMaybe optimalValue 
components

and

  +   addVal :: Name -> ExpQ -> ExpQ -> ExpQ

What do you think?

Otherwise, looks good. Thanks!

-- 
Klaus Aehlig
Google Germany GmbH, Dienerstr. 12, 80331 Muenchen
Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg
Geschaeftsfuehrer: Graham Law, Christine Elizabeth Flores

Reply via email to