I'm an advanced C# programmer learning F#. As an exercise I'm porting a function that calculates the check digit of a US ABA (routing) number. Here are 2 C# implementations:
int CalcCheckDigit(string rt)
{
var s = new[]{3,7,1,3,7,1,3,7}
.Zip(rt, (m,d) => m * int.Parse(d.ToString()))
.Sum();
return (int)Math.Ceiling(s / 10.0) * 10 - s;
}
int CalcCheckDigitOldSchool(string rt)
{
int[] mults = new[]{3,7,1,3,7,1,3,7};
int s = 0;
for (int i = 0; i < mults.Length; i++)
{
int digit = int.Parse(rt[i].ToString());
s += digit * mults[i];
}
double nextMultOfTen = Math.Ceiling(s / 10.0) * 10;
return (int)nextMultOfTen - s;
}
And here's my crack at it with F#:
let calcCheckDigit rt =
let s =
rt
|> Seq.zip [3;7;1;3;7;1;3;7]
|> Seq.map (fun (a,b) -> a * int(string b))
|> Seq.sum |> float
int (ceil (s / 10.0) * 10.0 - s)
How might the F# version be improved?