Jämförelse av programmeringsspråk (algebraisk datatyp)

Den här artikeln jämför syntaxen för att definiera och instansiera en algebraisk datatyp (ADT), ibland även kallad en taggad union , i olika programmeringsspråk .

Exempel på algebraiska datatyper

Ceylon

I Ceylon kan en ADT definieras med:

  
        

 
      

          
       abstrakt  klass  Träd  ()  av  ​​tom  |  Nod  {  }  objekt  tomt  förlänger  Träd  ()  {}  final  class  Nod  (  delat  heltalsvärde  ,  delat  träd  vänster  ,  delat  träd  höger  )  utökar  träd  ()  {} 

Och instansierat som:

    0    värde  myTree  =  Nod  (  42  ,  Nod  (  ,  tom  ,  tom  ),  tom  ); 

Rena

I Clean kan en ADT definieras med:

 
   
       ::  Träd  =  Tomt  |  Nod  Int  Tree  Tree 

Och instansierat som:

     0    myTree  =  Nod  42  (  Node  Empty  Empty  )  Tom 

Coq

I Coq kan en ADT definieras med:

    
   
          Induktivt  träd  :  Typ  :=  |  tomt  :  träd  |  nod  :  nat  ->  träd  ->  träd  ->  träd  . 

Och instansierat som:

      0    Definition  my_tree  :=  nod  42  (  nod  tom  tom  )  tom  . 

C++

I C++ kan en ADT definieras med:

   

   
     
      
      


     struct  Empty  final  {};  struct  Node  final  {  int  värde  ;  std  ::  unik_ptr  <  std  ::  variant  <  Tom  ,  Nod  >>  vänster  ;  std  ::  unik_ptr  <  std  ::  variant  <  Tom  ,  Nod  >>  höger  ;  };  använder  Tree  =  std  ::  variant  <  Empty  ,  Node  >  ; 

Och instansierat som:

   
    
    
        0
        
        
    
    
  Tree  myTree  {  Node  {  42  ,  std  ::  make_unique  <  Tree  >  (  Node  {  ,  std  ::  make_unique  <  Tree  >  (),  std  ::  make_unique  <  Tree  >  ()  }),  std  ::  make_unique  <  Tree  >  ()  }  }; 

Alm

I Elm kan en ADT definieras med:

 
   
       typ  Träd  =  Tom  |  Nod  Int  Tree  Tree 

Och instansierat som:

     0    myTree  =  Nod  42  (  Node  Empty  Empty  )  Tom 

F#

I F# kan en ADT definieras med:

  
     
            typ  Träd  =  |  Tom  |  Nod  av  int  *  Träd  *  Träd 

Och instansierat som:

    0    låt  myTree  =  Node  (  42  ,  Nod  (  ,  Empty  ,  Empty  ),  Empty  ) 

F*

I F* kan en ADT definieras med:

  
     
            typ  träd  =  |  Tom  :  träd  |  Nod  :  värde  :  nat  ->  vänster  :  träd  ->  höger  :  träd  ->  träd 

Och instansierat som:

      0    let  my_tree  =  Nod  42  (  Node  Empty  Empty  )  Empty 

Gratis Pascal

I Free Pascal kan en ADT definieras med:


     

    

    
       
       
       
         
          
      
   typ  TTreeKind  =  (  tkEmpty  ,  tkNode  )  ;  PTree  =  ^  TTree  ;  TTree  =  rekordfall  FKind  :  TTreeKind  of  tkEmpty  :  (  )  ;  tkNode  :  (  FValue  :  Heltal  ;  FLeft  ,  FRight  :  PTree  ;  )  ;  slut  ; 

Och instansierat som:


   


  
    
    
  
    
    0
  
    
  
    
  
    
 var  MyTree  :  PTree  ;  börja  nytt  (  MyTree  )  ;  MyTree  ^.  FKind  :=  tkNode  ;  MyTree  ^.  FVärde  :=  42  ;  ny  (  MyTree  ^.  FLeft  )  ;  MyTree  ^.  FLvänster  ^.  FKind  :=  tkNode  ;  MyTree  ^.  FLvänster  ^.  FVärde  :=  ;  new  (  MyTree  ^.  FLeft  ^.  FLeft  )  ;  MyTree  ^.  FLvänster  ^.  FLvänster  ^.  FKind  :=  tkEmpty  ;  ny  (  MyTree  ^.  FLeft  ^.  FRight  )  ;  MyTree  ^.  FLvänster  ^.  JÄTTE  ^.  FKind  :=  tkEmpty  ;  ny  (  MyTree  ^.  FRight  )  ;  MyTree  ^.  JÄTTE  ^.  FKind  :=  tkEmpty  ;  slut  . 

Haskell

I Haskell kan en ADT definieras med:

 
     
         dataträd  =  Tomt  |  _  Nod  Int  Tree  Tree 

Och instansierat som:

     0    myTree  =  Nod  42  (  Node  Empty  Empty  )  Tom 

Haxe

I Haxe kan en ADT definieras med:

  
	
	  
 enum  Träd  {  Tom  ;  Nod  (  värde  :  Int  ,  vänster  :  Träd  ,  höger  :  Träd  );  } 

Och instansierat som:

    0    var  myTree  =  Node  (  42  ,  Nod  (  ,  Empty  ,  Empty  ),  Empty  ); 

Hoppas

I Hope kan en ADT definieras med:

   
                 dataträd  ==  tom  ++  nod  (  num  #  träd  #  träd  )  ; 

Och instansierat som:

dec mytree : träd; --- mytree <= nod (42, nod (0, tom, tom), tom);

Idris

I Idris kan en ADT definieras med:

 
     
         dataträd  =  Tomt  |  _  Node  Nat  Tree  Tree 

Och instansierat som:

       0    myTree  :  Träd  myTree  =  Nod  42  (  Node  Empty  Empty  )  Empty 

Java

I Java kan en ADT definieras med:

   
        
             
 förseglat  gränssnitt  Träd  {  post  Tom  ()  implementerar  Tree  {}  post  Nod  (  int  värde  ,  Träd  vänster  ,  Träd  höger  )  implementerar  Träd  {}  } 

Och instansierat som:

    
    
     0    
     
 var  myTree  =  nytt  träd  .  Nod  (  42  ,  nytt  träd  .  Nod  (  ,  nytt  träd  .  Tomt  (),  nytt  träd  .  Tomt  ()),  nytt  träd  .  Tomt  ()  ); 

Julia

I Julia kan en ADT definieras med:

 


 
    
     
     


     struct  Empty  end  struct  Node  värde  ::  Int  left  ::  Union  {  Empty  ,  Node  }  right  ::  Union  {  Empty  ,  Node  }  end  const  Tree  =  Union  {  Empty  ,  Node  } 

Och instansierat som:

   0    mytree  =  Nod  (  42  ,  Nod  (  ,  Tom  (),  Tom  ()),  Tom  ()) 

Kotlin

I Kotlin kan en ADT definieras med:

   
       
                
 förseglad  klass  Träd  {  objekt  Tomt  :  Träd  (  )  dataklass  Nod  (  val  värde  :  Int  ,  val  vänster  :  Träd  ,  val  höger  :  Träd  )  :  Träd  ( )  } 

Och instansierat som:

   
    
    0  
    
 val  myTree  =  Träd  .  Nod  (  42  ,  Träd  .  Nod  (  ,  Träd  .  Tom  ,  Träd  .  Tom  ),  Träd  .  Tom  ,  ) 

Limbo

I Limbo kan en ADT definieras med:

  
	 
	 
	 
		 
		  
		  
	
 Träd  :  adt  {  pick  {  Empty  =>  Nod  =>  värde  :  int  ;  vänster  :  ref  Träd  ;  höger  :  ref  Träd  ;  }  }; 

Och instansierat som:

   
	
	 0    
	 
 myTree  :=  ref  Träd  .  Nod  (  42  ,  ref  Träd  .  Nod  (  ,  ref  Träd  .  Tom  (),  ref  Träd  .  Tom  ()),  ref  Träd  .  Tom  ()  ); 

Merkurius

I Merkurius kan en ADT definieras med:

:- skriv träd ---> tomt; nod(int, träd, träd).

Och instansierat som:

:- func mitt_träd = träd. mitt_träd = nod(42, nod(0, tom, tom), tom).

Miranda

I Miranda kan en ADT definieras med:

 
    
        träd  ::=  Tom  |  Nod  num  träd  träd  

Och instansierat som:

     0    my_tree  =  Nod  42  (  Node  Empty  Empty  )  Tom 

Nemerle

I Nemerle kan en ADT definieras med:

 

     
      
         
         
         
    
 variant  Träd  {  |  Tom  |  Nod  {  värde  :  int  ;  vänster  :  Träd  ;  höger  :  Träd  ;  }  } 

Och instansierat som:

   
    
    0  
    
 def  myTree  =  Träd  .  Nod  (  42  ,  Träd  .  Nod  (  ,  Träd  .  Tom  (),  Träd  .  Tom  ()),  Träd  .  Tom  (),  ); 

Nim

I Nim kan en ADT definieras med:


    
    
    

     

    
      
     
      
     
       
         typ  TreeKind  =  enum  tkEmpty  tkNode  Träd  =  ref  TreeObj  TreeObj  =  objektcasetyp  :  TreeKind  av  tkEmpty  :  kassera  tkNode  :  värde  :  int  vänster  ,  höger  :  Träd  _  _  _ 

Och instansierat som:

      
                      0
                               
                               
                     låt  myTree  =  Träd  (  typ  :  tkNode  ,  värde  :  42  ,  vänster  :  Träd  (  typ  :  tkNode  ,  värde  :  ,  vänster  :  Träd  (  typ  :  tkEmpty  ),  höger  :  Träd  (  typ  :  tkEmpty  )),  höger  :  Träd  (  snäll  :  tkEmpty  )) 

OCaml

I OCaml kan en ADT definieras med:

  
   
          typ  träd  =  |  Tom  |  Nod  för  int  *  träd  *  träd 

Och instansierat som:

      0    låt  mitt_träd  =  Nod  (  42  ,  Nod  (  ,  Empty  ,  Empty  ),  Empty  ) 

Opa

I Opa kan en ADT definieras med:


   
   skriv  träd  =  {  tomt  }  eller  {  nod  ,  int värde  ,  träd vänster  ,  träd höger  } 

Och instansierat som:

   
    

 
 
    
 mitt_träd  =  {  nod  ,  värde  :  42  ,  vänster  :  {  nod,  värde: 0,  vänster: {  tomt },  höger: {  tomt }  }  ,  höger  :  {  tomt }  } 

OpenCog

I OpenCog kan en ADT definieras med:

PureScript

I PureScript kan en ADT definieras med:

 
   
       dataträd  =  Tomt  |  _  Nod  Int  Tree  Tree 

Och instansierat som:

     0    myTree  =  Nod  42  (  Node  Empty  Empty  )  Tom 

Racket

I Typed Racket kan en ADT definieras med:

  
          
     (  struct  Empty  ())  (  struct  Node  ([  värde  :  Heltal  ]  [  vänster  :  Träd  ]  [  höger  :  Träd  ]))  (  definiera  träd  (  U  Tom  Node  )) 

Och instansierat som:

     0    (  definiera  mitt träd  (  Nod  42  (  Nod  (  Tom  )  (  Tom  ))  (  Tom  ))) 

Anledning

Anledning

I Reason kan en ADT definieras med:

  
   
      typ  Träd  =  |  Tom  |  Nod  (  int  ,  Träd  ,  Träd  ); 

Och instansierat som:

    0    let  myTree  =  Node  (  42  ,  Node  (  ,  Empty  ,  Empty  ),  Empty  ); 

Reskript

I ReScript kan en ADT definieras med:

   
   
      skriv  rec  Tree  =  |  Tom  |  Nod  (  int  ,  träd  ,  träd  ) 

Och instansierat som:

    0    låt  myTree  =  Node  (  42  ,  Nod  (  ,  Empty  ,  Empty  ),  Empty  ) 

Rost

I Rust kan en ADT definieras med:

  
    
      
 enum  Tree  {  Empty  ,  Node  (  i32  ,  Box  <  Tree  >  ,  Box  <  Tree  >  ),  } 

Och instansierat som:

   
    
    0  
    
 låt  mitt_träd  =  Träd  ::  Nod  (  42  ,  Box  ::  ny  (  Träd  ::  Nod  (  ,  Box  ::  ny  (  Träd  ::  Tom  ),  Box  ::  ny  (  Träd  ::  Tom  )),  Box  ::  ny  (  Träd  ::  Tom  ),  ); 

Scala

Scala 2

I Scala 2 kan en ADT definieras med: [ citat behövs ]

       

  
       
          
       
 förseglad  abstrakt  klass  Träd  sträcker sig  Produkt  med  serialiserbart  objekt  Träd  {  final  case  object  Empty  extends  Träd  slutlig  case  class  Node  (  värde  :  Int  ,  vänster  :  Träd  ,  höger  :  Träd  )  sträcker sig  Träd  } 

Och instansierat som:

   
  
  0  
  
 val  myTree  =  Träd  .  Nod  (  42  ,  Träd  .  Nod  (  ,  Träd  .  Tom  ,  Träd  .  Tom  ),  Träd  .  Tom  ) 

Scala 3

I Scala 3 kan en ADT definieras med:

 
   
         enum  Träd  :  case  Tom  case  Nod  (  värde  :  Int  ,  vänster  :  Träd  ,  höger  :  Träd  ) 

Och instansierat som:

   
  
  0  
  
 val  myTree  =  Träd  .  Nod  (  42  ,  Träd  .  Nod  (  ,  Träd  .  Tom  ,  Träd  .  Tom  ),  Träd  .  Tom  ) 

Standard ML

I Standard ML kan en ADT definieras med:

  
    
          datatypträd  =  TOM  |  _  NOD  för  int  *  träd  *  träd 

Och instansierat som:

      0    val  myTree  =  NOD  (  42  ,  NOD  (  ,  EMPTY  ,  EMPTY  ),  EMPTY  ) 

Snabb

I Swift kan en ADT definieras med:

  
     
        
 enum  Tree  {  case  tom  indirekt  case  nod  (  Int  ,  Tree  ,  Tree  )  } 

Och instansierat som:

     0    låt  myTree  :  Träd  =  .  nod  (  42  ,  .  nod  (  ,  .  tom  ,  .  tom  ),  .  tom  ) 

TypeScript

I TypeScript kan en ADT definieras med:

  
      
          typ  Träd  =  |  {  typ  :  "tom"  }  |  {  kind  :  "nod"  ;  värde  :  antal  ;  vänster  :  Träd  ;  höger  :  Träd  }; 

Och instansierat som:

   
   
  
   
     
    0
        
        
  
      
 const  myTree  :  Träd  =  {  typ  :  "nod"  ,  värde  :  42  ,  vänster  :  {  typ  :  "nod"  ,  värde  :  ,  vänster  :  {  typ  :  "tom"  },  höger  :  {  typ  :  "tom"  },  },  höger  :  {  snäll  :  "tom"  },  }; 

Visuell prolog

I Visual Prolog kan en ADT definieras med:


          domänträd  =  tomt  ;  _  nod  (  heltal  ,  träd  ,  träd  ). 

Och instansierat som:


         0    konstanter  mitt_träd  :  träd  =  nod  (  42  ,  nod  (  ,  tom  ,  tom  ),  tom  ).