For example.
module A = {
  type t
  type getKind = t => string
}
module B = {
  type t
  type getKind = t => string
 }
module C = {
  type t
}
Now I want to implement a function that requires the parameters to implement getKind, so that it can only accept A and B, but not C.
How can I implement this in Rescript?
             
            
              
              
              
            
            
                
                
              
           
          
            
            
              Your getKind example hinting at maybe something else but a “module type” is the first suggestion:
module type Kinded = {
  let getKind: t => string
}
module User = (K: Kinded) => {
  let caller = (t: K.t) => {
    K.getKind(t)
  }
}
HTH
             
            
              
              
              3 Likes
            
            
                
                
              
           
          
            
            
              It works, thank you very much.
             
            
              
              
              
            
            
                
                
              
           
          
            
            
              Another approach would be to implement your “getKind” function in each module then pass one as your function parameter (as a first class module)
module type Kinded = {
  let getKind: unit => string
}
module A = {
  let getKind = () => "A"
}
module B = {
  let getKind = () => "B"
}
module C = {
   let notTheSame = () => "C"
}
let getKind = (~kind: module(Kinded)) => {
  let module(Kinded) = kind
  Kinded.getKind
}
getKind(~kind=module(A))->Js.log  // A
getKind(~kind=module(B))->Js.log  // B
getKind(~kind=module(C))->Js.log  // Type Errors. Signature mismatch: The value `getKind' is required but not provided
             
            
              
              
              5 Likes
            
            
                
                
              
                
           
          
            
            
              How do you choose first class module or functor?
             
            
              
              
              
            
            
                
                
              
           
          
            
            
              I think you just have to choose the one that fit best your needs, that is easily maintainable and scalable.