Tomas Petricek の回答の更新版。コンパイルされ、減少する範囲で機能します (および測定単位で機能します): (ただし、見栄えはよくありません)
let rec frange(from:float<'a>, by:float<'a>, tof:float<'a>) =
// (extra ' here for formatting)
seq {
yield from
if (float by > 0.) then
if (from + by <= tof) then yield! frange(from + by, by, tof)
else
if (from + by >= tof) then yield! frange(from + by, by, tof)
}
#r "FSharp.Powerpack"
open Math.SI
frange(1.0<m>, -0.5<m>, -2.1<m>)
更新これが新しいものなのか、それとも常に可能だったのかはわかりませんが、( here )、この-より単純な-構文も可能であることを発見しました:
let dl = 9.5 / 11.
let min = 21.5 + dl
let max = 40.5 - dl
let a = [ for z in min .. dl .. max -> z ]
let b = a.Length
(注意してください、この特定の例には落とし穴があります:)