haskell - Confusing types in ghci -


here code:

n = [(a,b) | <- [1..5],b <- [1..5]] calcbmis xs = [bmi | (w, h) <- xs,let bmi = w / h ^ 2]   

when trying apply calcbmis n, following error:

*charana> calcbmis n  <interactive>:220:1:     no instance (fractional integer)     arising use of ‘calcbmis’     in expression: calcbmis n     in equation ‘it’: = calcbmis n 

further investigation in ghci:

*charana> :t calcbmis calcbmis :: fractional t => [(t, t)] -> [t] *charana> :t n n :: [(integer, integer)] 

what i'm assuming list produce of type (integer,integer), cannot processed in calcbmis, takes in fractional. idea how fix problem?

you can use div instead of (/):

calcbmis xs = [ bmi | (w,h) <- xs, let bmi = (w `div` h)^2 ]  prelude> :t calcbmis calcbmis :: integral t => [(t, t)] -> [t]  prelude> calcbmis n [1,0,0,0,0,4,1,0,0,0,9,1,1,0,0,16,4,1,1,0,25,4,1,1,1] 

as can see version can deal integral values - of course truncate (because of div).

or can map fromintegral:

calcbmis xs = [ bmi | (w,h) <- xs, let bmi = (fromintegral w / fromintegral h)^2 ]  prelude> :t calcbmis calcbmis:: (fractional t, integral t1, integral t2) => [(t1, t2)] -> [t] 

which produce fractional values:

prelude> calcbmis n [1.0,0.25,0.1111111111111111 ,6.25e-2 ,4.000000000000001e-2 ,4.0 ,1.0 ,0.4444444444444444 , ... ] 

in either case work inputs long instance of integral - second version accept pairs of different integrals ;)


Comments

Popular posts from this blog

php - Invalid Cofiguration - yii\base\InvalidConfigException - Yii2 -

How to show in django cms breadcrumbs full path? -

ruby on rails - npm error: tunneling socket could not be established, cause=connect ETIMEDOUT -