Hi, The code below compiles fine as it is, but if I change the import statement to:
import Data.Array.Unboxed I get the following error: philip-beadlings-imac-g5:MonteCarlo phil$ ghc -O2 --make test.hs [2 of 5] Compiling InverseNormal ( InverseNormal.hs, InverseNormal.o ) InverseNormal.hs:28:38: No instance for (IArray a1 Double) arising from a use of `!' at InverseNormal.hs:28:38-40 Possible fix: add an instance declaration for (IArray a1 Double) In the first argument of `(*)', namely `c ! 1' In the first argument of `(+)', namely `c ! 1 * q' In the first argument of `(*)', namely `(c ! 1 * q + c ! 2)' ....and so on My understanding is that I should just be able to use them like-for-like? Anyone seen this before? Thanks, Phil. module InverseNormal where import Array a = listArray (1,6) [-3.969683028665376e+01, 2.209460984245205e+02, -2.759285104469687e+02, 1.383577518672690e+02, -3.066479806614716e+01, 2.506628277459239e+00] b = listArray (1,5) [-5.447609879822406e+01, 1.615858368580409e+02, -1.556989798598866e+02, 6.680131188771972e+01, -1.328068155288572e+01] c = listArray (1,6) [-7.784894002430293e-03, -3.223964580411365e-01, -2.400758277161838e+00, -2.549732539343734e+00, 4.374664141464968e+00, 2.938163982698783e+00] d = listArray (1,4) [7.784695709041462e-03, 3.224671290700398e-01, 2.445134137142996e+00, 3.754408661907416e+00] invnorm :: Double -> Double invnorm p | p < 0.02425 = let q = sqrt ( -2*log(p) ) in (((((c!1*q+c!2)*q+c!3)*q+c!4)*q+c!5)*q+c!6) / ((((d!1*q+d!2)*q+d!3)*q+d!4)*q+1) | p > (1-0.02425) = let q = sqrt ( -2*log(1-p) ) in -(((((c!1*q+c!2)*q+c!3)*q+c!4)*q+c!5)*q+c!6) / ((((d!1*q+d!2)*q+d!3)*q+d!4)*q+1) | otherwise = let q = p-0.5 r = q*q in (((((a!1*r+a!2)*r+a!3)*r+a!4)*r+a!5)*r+a!6)*q / (((((b!1*r+b!2)*r+b!3)*r+b!4)*r+b!5)*r+1)
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe