Project Euler 45

http://projecteuler.net/index.php?section=problems&id=45


この問題はほとんどProject Euler 37と同じです。
Haskellだと簡単に書けます。

polygonal p = [ div (n * ((p - 1) * n + 4 - p)) 2 | n <- [1..] ]
coincident (p:ps) (q:qs) | p == q = p:(coincident ps qs)
                         | p <  q = coincident ps (q:qs)
                         | p >  q = coincident (p:ps) qs
main = print (head (tail (tail
            (coincident (polygonal 5) (polygonal 6)))))

しかし、F#では無限列はリストでは扱えそうにないですし、SequenceではHeadを取り出してTailで再帰的に呼び出すということができないようです。
仕方がないので、次のように3回目に一致した値を取り出す、というようにしてみました。

let Polygonal p n = n * ((p - 2L) * n + 4L - p) / 2L
let P = Polygonal 5L
let H = Polygonal 6L

let rec coincident f m g n counter =
   let p = f m
   let q = g n
   if p = q then
      if counter = 1 then
         p
      else
         coincident f (m + 1L) g (n + 1L) (counter - 1)
   else if p < q then
      coincident f (m + 1L) g n counter
   else
      coincident f m g (n + 1L) counter

printfn "%d" (coincident P 1L H 1L 3)