Let's say I have these code:
namespace global
module NumeracyProblemsInTen=
    module private Random=
        let private a=lazy System.Random()
        let getRandom()=a.Force()
        let next()=getRandom().Next()
        let lessThan exclusiveMax=getRandom().Next exclusiveMax
        let pick seq=
            assert(not<|Seq.isEmpty seq)
            lessThan<|Seq.length seq|>Seq.item<|seq
    module UsedNumbers=
        let min,max=1,9 // *want to make these data variable*
        let numbers={min..max}
        let atLeast a=numbers|>Seq.skipWhile((>)a)
        let atMost a=numbers|>Seq.takeWhile((>=)a)
        module Random=
            let private pick=Random.pick
            let pickNumber()=pick numbers
            let atMost=atMost>>pick
    open UsedNumbers
    module AdditionInTen=
        module Addends=
            let max=max-min
            let numbers={min..max}
            let pick()=Random.pick numbers
        open Addends
        let quiz()=
            let addend=pick()
            addend,Random.atMost<|min+max-addend
        let calc(addend,another)=addend+another
    module MultiplyInTen=
        let quiz()=
            let multipiler=Random.pickNumber()
            multipiler,Random.pick{min..max/multipiler}
        let calc(multipiler,another)=multipiler*another
    module SubtractionInTen=
        let minSubtrahend,minResult=min,min
        let minMinuend=minSubtrahend+minResult
        let minuends=atLeast minMinuend
        let quiz()=
            let minuend=Random.pick minuends
            minuend,Random.pick{minSubtrahend..minuend-minResult}
        let calc(minuend,subtrahend)=minuend-subtrahend
    module DeviditionInTen=
        let devisible devidend deviser=devidend%deviser=0
        let findDevisers devidend=numbers|>Seq.filter(devisible devidend)
        let findDeviditions devidend=findDevisers devidend|>Seq.map(fun deviser->devidend,deviser)
        let problems=Seq.collect findDeviditions numbers
        let quiz()=Random.pick problems
        let calc(devidend,deviser)=devidend/deviser
    type Problem=Addition of int*int|Subtraction of int*int|Multiply of int*int|Devidition of int*int
    let quiz()=
        let quizers=[AdditionInTen.quiz>>Addition;SubtractionInTen.quiz>>Subtraction;
            MultiplyInTen.quiz>>Multiply;DeviditionInTen.quiz>>Devidition]
        quizers|>Random.pick<|()
    let calc problem=
        match problem with
            |Addition(addend,another)->AdditionInTen.calc(addend,another)
            |Subtraction(minuend,subtrahend)->SubtractionInTen.calc(minuend,subtrahend)
            |Multiply(multipiler,another)->MultiplyInTen.calc(multipiler,another)
            |Devidition(devidend,deviser)->DeviditionInTen.calc(devidend,deviser)
module NumeracyProblemsUnderOneHundred=
    module UsedNumbers=
        let min,max=1,99
        // ...
    // ...
    // ...
    // OMG! Do I must copy all the previous code here?
If I use oo/types, I can simply define Max as a property, is there a good way to resolve the same scene without object/types but only modules/immutable bindings way? A bit of more complex scene should be also considered, more configurable data, with more usage in different ways.