[Haskell-beginners] Re: question about styles of recursion
Daniel Fischer
daniel.is.fischer at web.de
Thu Mar 26 17:10:45 EDT 2009
Am Donnerstag 26 März 2009 21:53:47 schrieb 7stud:
> 7stud <bbxx789_05ss <at> yahoo.com> writes:
> > > myAvg' :: Int -> [Int] -> [ Double ] -> Double
> > > myAvg' sum count [] = sum / fromIntegral count
> > > myAvg' sum count (x:xs) = myAvg' (x + sum) (n + 1) xs
> >
> > The length function was introduced
> > before the sum function, which I see you are using in your
> > function definition.
>
> Hmm...I guess you aren't using the sum function--that's one
> of your variable names. I wonder how Prelude knows sum
> is a variable name and not the sum function?
Name shadowing/scoping. By naming one of the parameters sum, a
local variable with that name is declared and Prelude.sum is only
accessible qualified in that scope. It's the same as declaring local
variables with the same name as one in an enclosing scope in other
languages.
> I changed the
> name sum to s, and I get this error:
>
> Prelude Data.List> :load ehask.hs
> [1 of 1] Compiling Main ( ehask.hs, interpreted )
>
> ehask.hs:2:24:
> Couldn't match expected type `Double' against inferred type `Int'
> In the expression: s / fromIntegral count
> In the definition of `myAvg'':
> myAvg' s count [] = s / fromIntegral count
> Failed, modules loaded: none.
>
Yup, the type signature is wrong, it should be
myAvg' :: Double -> Int -> [Double] -> Double
More information about the Beginners
mailing list