Hasan A Yousef
Hasan A Yousef

Reputation: 25008

This expression was expected to have type 'double' but here has type 'unit'

Ive an array of integers, and want to do the following operation:

s += array(index+1) - array(index)

so, I tried the below:

let mutable s =0
for i in 0 .. slen-1 do
s <- series.[i+1] - series.[i] + s

but I goy an error:

This expression was expected to have type 'double' but here has type 'unit'

UPDATE

The full code

let series = [|30;21;29;31;40;48;53;47;37;39;31;29;17;9;20;24;27;35;41;38;
          27;31;27;26;21;13;21;18;33;35;40;36;22;24;21;20;17;14;17;19;
          26;29;40;31;20;24;18;26;17;9;17;21;28;32;46;33;23;28;22;27;
          18;8;17;21;31;34;44;38;31;30;26;32|]

let initialTrend series slen : double=
    let mutable s = 0
    for i in 0 .. slen-1 do
    s <- series.[i+1] - series.[i] + s

Upvotes: 1

Views: 147

Answers (1)

Gus
Gus

Reputation: 26204

Well, you are telling that the function will return a double and the error message is telling you that it doesn't return anything, that's correct.

Either, remove the return type:

let initialTrend series slen : unit =
  let mutable s = 0
  for i in 0 .. slen-1 do
    s <- series.[i+1] - series.[i] + s

or change the way the function works:

let initialTrend (series: _ list) slen : double=
    let mutable s = 0
    for i in 0 .. slen-1 do
        s <- series.[i+1] - series.[i] + s
    float s

But, looking at your recent questions, you are still sticking to mutability. I would suggest to use a higher order function here instead:

let initialTrend (series: float [])  : double =
    Array.pairwise series |> Array.fold (fun s (x0, x1) -> x1 - x0 + s) 0.

Upvotes: 6

Related Questions