F# Static Member Type Constraints

前端 未结 3 1158
伪装坚强ぢ
伪装坚强ぢ 2020-12-02 23:39

I\'m trying to define a function, factorize, which uses structural type constraints (requires static members Zero, One, +, and /) similar to Seq.sum so that it can be used w

3条回答
  •  萌比男神i
    2020-12-03 00:08

    Here's how I'd write it:

    module NumericLiteralG = begin
      let inline FromZero() = LanguagePrimitives.GenericZero
      let inline FromOne() = LanguagePrimitives.GenericOne
    end
    
    let inline factorize n = 
      let rec factorize n j flist =  
        if n = 1G then flist 
        elif n % j = 0G then factorize (n/j) j (j::flist) 
        else factorize n (j + 1G) (flist) 
      factorize n (1G + 1G) [] 
    

    The type inferred for factorize here is way too general, but the function will work as you'd expect. You can force a more sane signature and set of constraints if you want by adding explicit types to some of the generic expressions:

    let inline factorize (n:^a) : ^a list = 
      let (one : ^a) = 1G
      let (zero : ^a) = 0G
      let rec factorize n (j:^a) flist =  
        if n = one then flist 
        elif n % j = zero then factorize (n/j) j (j::flist) 
        else factorize n (j + one) (flist) 
      factorize n (one + one) []
    

提交回复
热议问题