Porównanie języków programowania (algebraiczny typ danych)

W tym artykule porównano składnię definiowania i tworzenia wystąpień algebraicznego typu danych (ADT), czasami określanego również jako unia tagowana , w różnych językach programowania .

Przykłady algebraicznych typów danych

Cejlon

Na Cejlonie ADT można zdefiniować za pomocą:

  
        

 
      

          
       Klasa  abstrakcyjna  Drzewo  (  )  pustych  |  Węzeł  {}  obiekt  pusty  extends  Tree  ()  {}  final  class  Node  (  shared  Integer  val  ,  shared  Tree  left  ,  share  Tree  right  )  extends  Tree  ()  {} 

I utworzone jako:

    0    wartość  myTree  =  Node  (  42  ,  Node  (  ,  pusty  ,  pusty  ),  pusty  ); 

Czysty

W Clean ADT można zdefiniować za pomocą:

 
   
       ::  Drzewo  =  Puste  |  Węzeł  Int  Drzewo  Drzewo 

I utworzone jako:

     0    myTree  =  Węzeł  42  (  węzeł  pusty  pusty  )  pusty 

Coq

W Coq ADT można zdefiniować za pomocą:

    
   
          Drzewo  indukcyjne  :  Typ  :=  |  pusty  :  drzewo  |  węzeł  :  nat  ->  drzewo  ->  drzewo  ->  drzewo  . 

I utworzone jako:

      0    Definicja  my_tree  :=  węzeł  42  (  węzeł  pusty  pusty  )  pusty  . 

C++

W C++ ADT można zdefiniować za pomocą:

   

   
     
      
      


     struct  Pusty  finał  {};  struct  Node  final  {  int  value  ;  std  ::  unique_ptr  <  std  ::  wariant  <  pusty  ,  węzeł  >>  lewy  ;  std  ::  unique_ptr  <  std  ::  wariant  <  Pusty  ,  Węzeł  >>  w prawo  ;  };  używając  Tree  =  std  ::  wariant  <  Pusty  ,  Węzeł  >  ; 

I utworzone jako:

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

Wiąz

W Elm ADT można zdefiniować za pomocą:

 
   
       wpisz  Drzewo  =  Puste  |  Węzeł  Int  Drzewo  Drzewo 

I utworzone jako:

     0    myTree  =  Węzeł  42  (  węzeł  pusty  pusty  )  pusty 

F#

W języku F# ADT można zdefiniować za pomocą:

  
     
            wpisz  Drzewo  =  |  Pusty  |  Węzeł  typu  int  *  Drzewo  *  Drzewo 

I utworzone jako:

    0    niech  myTree  =  Node  (  42  ,  Node  (  ,  Pusty  ,  Pusty  ),  Pusty  ) 

F*

W F* ADT można zdefiniować za pomocą:

  
     
            wpisz  drzewo  =  |  Puste  :  drzewo  |  Węzeł  :  wartość  :  nat  ->  lewo  :  drzewo  ->  prawo  :  drzewo  ->  drzewo 

I utworzone jako:

      0    niech  my_tree  =  Node  42  (  Node  Empty  Empty  )  Pusty 

Wolny Pascal

We Free Pascalu ADT można zdefiniować za pomocą:


     

    

    
       
       
       
         
          
      
   wpisz  TTreeKind  =  (  tkEmpty  ,  tkNode  )  ;  PTree  =  ^  TTree  ;  TTree  =  przypadek  rekordu  FKind  :  TTreeKind  of  tkEmpty  :  ()  ;  tkNode  :  (  FValue  :  Integer  ;  FLeft  ,  Fright  :  PTree  ;  )  ;  koniec  ; 

I utworzone jako:


   


  
    
    
  
    
    0
  
    
  
    
  
    
 var  Moje Drzewo  :  PTree  ;  rozpocznij  nowe  (  Moje drzewo  )  ;  Moje drzewo  ^.  FKind  :=  tkNode  ;  Moje drzewo  ^.  Fwartość  :=  42  ;  nowy  (  Moje drzewo  ^  .FLeft  )  ;  Moje drzewo  ^.  W lewo  ^.  FKind  :=  tkNode  ;  Moje drzewo  ^.  W lewo  ^.  FWartość  :=  ;  nowy  (  MojeDrzewo  ^  .FLeft  ^  .FLeft  )  ;  Moje drzewo  ^.  W lewo  ^.  W lewo  ^.  FKind  :=  tkEmpty  ;  nowy  (  MyTree  ^.  FLeft  ^.  Fright  )  ;  Moje drzewo  ^.  W lewo  ^.  PRZESTRZEŃ  ^.  FKind  :=  tkEmpty  ;  nowy  (  MyTree  ^  .FRight  )  ;  Moje drzewo  ^.  PRZESTRZEŃ  ^.  FKind  :=  tkEmpty  ;  koniec  . 

Haskella

W Haskell ADT można zdefiniować za pomocą:

 
     
         Drzewo  danych  =  Puste  |  Węzeł  Int  Drzewo  Drzewo 

I utworzone jako:

     0    myTree  =  Węzeł  42  (  węzeł  pusty  pusty  )  pusty 

Haxe

W Haxe ADT można zdefiniować za pomocą:

  
	
	  
 enum  Drzewo  {  Puste  ;  Węzeł  (  wartość  :  Int  ,  lewo  :  Drzewo  ,  prawo  :  Drzewo  );  } 

I utworzone jako:

    0    var  myTree  =  Węzeł  (  42  ,  Węzeł  (  ,  Pusty  ,  Pusty  ),  Pusty  ); 

Mieć nadzieję

W Hope ADT można zdefiniować za pomocą:

   
                 drzewo  danych  ==  pusty  węzeł  ++  (  numer  #  drzewo  #  drzewo  ); 

I utworzone jako:

dec mytree : drzewo; --- mojedrzewo <= węzeł (42, węzeł (0, pusty, pusty), pusty);

Idrys

W Idris ADT można zdefiniować za pomocą:

 
     
         Drzewo  danych  =  Puste  |  Węzeł  Nat  Drzewo  Drzewo 

I utworzone jako:

       0    myTree  :  Tree  myTree  =  Węzeł  42  (  węzeł  pusty  pusty  )  pusty 

Jawa

W Javie ADT można zdefiniować za pomocą:

   
        
             
 uszczelniony  interfejs  Drzewo  {  rekord  Pusty  ()  implementuje  Drzewo  {}  rekord  Węzeł  (  wartość  int  ,  Drzewo  po lewej  ,  Drzewo  po prawej  )  implementuje  Drzewo  {}  } 

I utworzone jako:

    
    
     0    
     
 var  mojeDrzewo  =  nowe  Drzewo  .  Węzeł  (  42  ,  nowe  drzewo  .  Węzeł  (  ,  nowe  drzewo  .  Puste  (),  nowe  drzewo  .  Puste  ()),  nowe  drzewo  .  Puste  ()  ); 

Julia

W Julii ADT można zdefiniować za pomocą:

 


 
    
     
     


     struct  Empty  end  struct  Node  value  ::  Int  left  ::  Union  {  Empty  ,  Node  }  right  ::  Union  {  Empty  ,  Node  }  end  const  Tree  =  Union  {  Empty  ,  Node  } 

I utworzone jako:

   0    mytree  =  Węzeł  (  42  ,  Węzeł  (  ,  Pusty  (),  Pusty  ()),  Pusty  ()) 

Kotlin

W Kotlinie ADT można zdefiniować za pomocą:

   
       
                
 klasa  zapieczętowana  Drzewo  {  obiekt  Pusty  :  Drzewo  ()  klasa  danych  Węzeł  (  wartość  val  :  Int  ,  val  left  :  Tree  ,  val  right  :  Tree  )  :  Tree  ()  } 

I utworzone jako:

   
    
    0  
    
 val  myTree  =  Drzewo  .  Węzeł  (  42  ,  Drzewo  .  Węzeł  (  ,  Drzewo  .  Pusty  ,  Drzewo  .  Pusty  ),  Drzewo  .  Pusty  ,  ) 

Otchłań

W Limbo ADT można zdefiniować za pomocą:

  
	 
	 
	 
		 
		  
		  
	
 Drzewo  :  adt  {  pick  {  Pusty  =>  Węzeł  =>  wartość  :  int  ;  po lewej  :  ref  Drzewo  ;  po prawej  :  ref  Drzewo  ;  }  }; 

I utworzone jako:

   
	
	 0    
	 
 myTree  :=  ref  Drzewo  .  Węzeł  (  42  ,  ref  Drzewo  .  Węzeł  (  ,  ref  Drzewo  .  Pusty  (),  ref  Drzewo  .  Pusty  ()),  ref  Drzewo  .  Pusty  ()  ); 

Rtęć

W Merkurym ADT można zdefiniować za pomocą:

:- wpisz drzewo ---> puste ; węzeł(int, drzewo, drzewo).

I utworzone jako:

:- funkcja moje_drzewo = drzewo. my_tree = node(42, node(0, pusty, pusty), pusty).

Mirando

W Mirandzie ADT można zdefiniować za pomocą:

 
    
        drzewo  ::=  Puste  |  Węzeł  num  drzewo  drzewo  

I utworzone jako:

     0    my_tree  =  Węzeł  42  (  węzeł  pusty  pusty  )  pusty 

Nemerle

W Nemerle ADT można zdefiniować za pomocą:

 

     
      
         
         
         
    
 wariant  Drzewo  {  |  Pusty  |  węzeł  {  wartość  :  int  ;  po lewej  :  Drzewo  ;  po prawej  :  Drzewo  ;  }  } 

I utworzone jako:

   
    
    0  
    
 def  myTree  =  Drzewo  .  Węzeł  (  42  ,  Drzewo  .  Węzeł  (  ,  Drzewo  .  Pusty  (),  Drzewo  .  Pusty  ()),  Drzewo  .  Pusty  (),  ); 

Nim

W Nim ADT można zdefiniować za pomocą:


    
    
    

     

    
      
     
      
     
       
         type  TreeKind  =  enum  tkEmpty  tkNode  Tree  =  ref  TreeObj  TreeObj  =  obiekt  case  kind  :  TreeKind  of  tkEmpty  :  odrzuć  tkNode  :  value  :  int  left  ,  right  :  Tree  _ 

I utworzone jako:

      
                      0
                               
                               
                     niech  myTree  =  Tree  (  rodzaj  :  tkNode  ,  wartość  :  42  ,  lewy  :  Drzewo  (  rodzaj  :  tkNode  ,  wartość  :,  lewy  :  Drzewo  (  rodzaj  :  tkEmpty  ),  prawy  :  Drzewo  (  rodzaj  :  tkEmpty  )  ),  prawy  :  Drzewo  (  rodzaj  :  tkEmpty )   )) 

OCaml

W OCaml ADT można zdefiniować za pomocą:

  
   
          wpisz  drzewo  =  |  Pusty  |  Węzeł  typu  int  *  tree  *  tree 

I utworzone jako:

      0    niech  moje_drzewo  =  Węzeł  (  42  ,  Węzeł  (  ,  Pusty  ,  Pusty  ),  Pusty  ) 

Opa

W Opa ADT można zdefiniować za pomocą:


   
   wpisz  drzewo  =  {  puste  }  lub  {  węzeł  ,  wartość int  ,  lewe drzewo  ,  prawe drzewo  } 

I utworzone jako:

   
    

 
 
    
 moje_drzewo  =  {  węzeł  ,  wartość  :  42  ,  lewy  :  {  węzeł,  wartość: 0,  lewy: {  pusty},  prawy: {  pusty}  }  ,  prawy  :  {  pusty}  } 

OpenCog

W OpenCog ADT można zdefiniować za pomocą:

PureScript

W PureScript ADT można zdefiniować za pomocą:

 
   
       Drzewo  danych  =  Puste  |  Węzeł  Int  Drzewo  Drzewo 

I utworzone jako:

     0    myTree  =  Węzeł  42  (  węzeł  pusty  pusty  )  pusty 

Rakieta

W Typed Racket, ADT można zdefiniować za pomocą:

  
          
     (  struct  Empty  ())  (  struct  Node  ([  value  :  Integer  ]  [  left  :  Tree  ]  [  right  :  Tree  ]))  (  zdefiniuj-type  Tree  (  U  Empty  Node  )) 

I utworzone jako:

     0    (  zdefiniuj  moje drzewo  (  Węzeł  42  (  Węzeł  (  Pusty  )  (  Pusty  ))  (  Pusty  ))) 

Powód

Powód

W Reason ADT można zdefiniować za pomocą:

  
   
      wpisz  Drzewo  =  |  Pusty  |  Węzeł  (  int  ,  drzewo  ,  drzewo  ); 

I utworzone jako:

    0    niech  myTree  =  Węzeł  (  42  ,  Węzeł  (  ,  Pusty  ,  Pusty  ),  Pusty  ); 

Reskrypt

W ReScript ADT można zdefiniować za pomocą:

   
   
      wpisz  rec  Drzewo  =  |  Pusty  |  Węzeł  (  int  ,  Drzewo  ,  Drzewo  ) 

I utworzone jako:

    0    niech  myTree  =  Node  (  42  ,  Node  (  ,  Pusty  ,  Pusty  ),  Pusty  ) 

Rdza

W Rust ADT można zdefiniować za pomocą:

  
    
      
 enum  Drzewo  {  Pusty  ,  Węzeł  (  i32  ,  Pole  <  Drzewo  >  ,  Pole  <  Drzewo  >  ),  } 

I utworzone jako:

   
    
    0  
    
 niech  my_tree  =  Tree  ::  Node  (  42  ,  Box  ::  new  (  Tree  ::  Node  (  ,  Box  ::  new  (  Tree  ::  Empty  ),  Box  ::  new  (  Tree  ::  Empty  )),  Box  ::  new  (  Tree  ::  Pusty  ),  ); 

Scala

Skala 2

W Scali 2 ADT można zdefiniować za pomocą: [ potrzebne źródło ]

       

  
       
          
       
 Sealed  abstract  class  Tree  extends  Product  with  Serializable  object  Tree  {  final  case  object  Empty  extends  Tree  final  case  class  Node  (  value  :  Int  ,  left  :  Tree  ,  right  :  Tree  )  extends  Tree  } 

I utworzone jako:

   
  
  0  
  
 val  myTree  =  Drzewo  .  Węzeł  (  42  ,  Drzewo  .  Węzeł  (  ,  Drzewo  .  Pusty  ,  Drzewo  .  Pusty  ),  Drzewo  .  Pusty  ) 

Skala 3

W Scali 3 ADT można zdefiniować za pomocą:

 
   
         enum  Drzewo  :  sprawa  Pusta  sprawa  Węzeł  (  wartość  :  Int  ,  po lewej  :  Drzewo  ,  po prawej  :  Drzewo  ) 

I utworzone jako:

   
  
  0  
  
 val  myTree  =  Drzewo  .  Węzeł  (  42  ,  Drzewo  .  Węzeł  (  ,  Drzewo  .  Pusty  ,  Drzewo  .  Pusty  ),  Drzewo  .  Pusty  ) 

standardowy ML

W standardowym ML ADT można zdefiniować za pomocą:

  
    
          drzewo  typów danych  =  PUSTY  |  WĘZEŁ  typu  int  *  drzewo  *  drzewo 

I utworzone jako:

      0    val  myTree  =  WĘZEŁ  (  42  ,  WĘZEŁ  (  ,  PUSTY  ,  PUSTY  ),  PUSTY  ) 

Szybki

W Swift ADT można zdefiniować za pomocą:

  
     
        
 enum  Tree  {  case  pusty  pośredni  przypadek  node  (  Int  ,  Tree  ,  Tree  )  } 

I utworzone jako:

     0    niech  myTree  :  Tree  =  .  węzeł  (  42  ,  .  węzeł  (  ,  .  pusty  ,  .  pusty  ),  .  pusty  ) 

Maszynopis

W TypeScript ADT można zdefiniować za pomocą:

  
      
          wpisz  Drzewo  =  |  {  rodzaj  :  "pusty"  }  |  {  rodzaj  :  "węzeł"  ;  wartość  :  liczba  ;  po lewej  :  Drzewo  ;  po prawej  :  Drzewo  }; 

I utworzone jako:

   
   
  
   
     
    0
        
        
  
      
 const  myTree  :  Tree  =  {  rodzaj  :  "węzeł"  ,  wartość  :  42  ,  left  :  {  rodzaj  :  "węzeł"  ,  wartość  :,  left  :  {  rodzaj  :  "pusty"  },  right  :  {  rodzaj  :  "pusty"  }  ,  },  po prawej  :  {  rodzaj  :  "pusty"  },  }; 

Prolog wizualny

W Visual Prolog ADT można zdefiniować za pomocą:


          drzewo  domen  =  puste  ;  węzeł  (  liczba całkowita  ,  drzewo  ,  drzewo  ). 

I utworzone jako:


         0    stałe  my_tree  :  tree  =  node  (  42  ,  node  (  ,  pusty  ,  pusty  ),  pusty  ).