Εξαγωγή τύπων

Ο όρος εξαγωγή τύπων ή συμπερασμός τύπων (type inference) αναφέρεται στην αυτόματη συνεπαγωγή του τύπου μιας τιμής σε μια γλώσσα προγραμματισμού. Σαν χαρακτηριστικό συναντάται σε κάποιες γλώσσες με ισχυρό στατικό σύστημα τύπων. Συχνά χρησιμοποιείται σε γλώσσες συναρτησιακού προγραμματισμού αλλά δεν περιορίζεται σε αυτές. Κάποιες γλώσσες που έχουν εξαγωγή τύπων είναι η Visual Basic (από την έκδοση 9.0), η C# (από την έκδοση 3.0), η Clean, η Haskell, η ML, η OCaml και η Scala. Επίσης πρόκειται να υποστηρίζεται από την C++0x και την Perl 6. Η ικανότητα αυτόματης εξαγωγής τύπων διευκολύνει πολλές προγραμματιστικές διεργασίες, επιτρέποντας στον προγραμματιστή να παραλείπει τον τύπο μιας έκφρασης, χωρίς να εμποδίζει τον έλεγχο των τύπων (type checking).

Γενική περιγραφή

Στις περισσότερες γλώσσες προγραμματισμού όλες οι τιμές έχουν έναν τύπο, ο οποίος περιγράφει το είδος των δεδομένων που απεικονίζει η τιμή. Στις γλώσσες με δυναμικούς τύπους ο τύπος μιας έκφρασης είναι γνωστός μόνο κατά το χρόνο εκτέλεσης. Στις γλώσσες με στατικούς τύπους ο τύπος μιας έκφρασης είναι γνωστός στο χρόνο μεταγλώττισης. Στις γλώσσες με στατικούς τύπους οι τύποι εισόδου και εξόδου των συναρτήσεων και οι τοπικές μεταβλητές συνήθως πρέπει να συνοδεύονται από σημειώσεις τύπων (type annotations). Για παράδειγμα, στη C:

int addone(int x) {
    int result; /* δηλώνει αποτέλεσμα ακέραιο (της C) */

    result = x+1;
    return result;
}

Στην αρχή αυτού του ορισμού συνάρτησης, η int addone(int x) δηλώνει ότι η addone είναι μια συνάρτηση που παίρνει ένα όρισμα, που είναι ακέραιος, και επιστρέφει ακέραιο. Η int result; δηλώνει ότι η τοπική μεταβλητή result είναι ακέραιος. Σε μια υποτιθέμενη γλώσσα με εξαγωγή τύπων, ο κώδικας θα μπορούσε να γραφτεί ως εξής:

addone(x) {
    val result;  /* ο τύπος του result θα εξαχθεί */
    val result2; /* ο τύπος του result #2 θα εξαχθεί */

    result = x+1;
    result2 = x+1.0;  /* δεν είναι αποδεκτό (στην υποτιθέμενη γλώσσα) */
    return result;
}

Τα παραπάνω μοιάζουν με κώδικα γραμμένο σε κάποια γλώσσα με δυναμικούς τύπους, αλλά με κάποιους επιπλέον περιορισμούς (που θα αναφερθούν στη συνέχεια) είναι δυνατό να εξαχθούν (infer) οι τύποι όλων των μεταβλητών στο χρόνο μεταγλώττισης. Στο παραπάνω παράδειγμα, ο μεταγλωττιστής θα κατέληγε ότι η result και η x έχουν τύπο ακέραιο και η addone είναι συνάρτηση int -> int. Η μεταβλητή result2 δε χρησιμοποιείται σωστά, επομένως δε θα είχε κάποιο τύπο.

Ο μεταγλωττιστής θα υπέθετε, αν δεν υπήρχε αντίθετη πληροφορία, ότι ο τελεστής + δέχεται δύο ακεραίους και επιστρέφει έναν ακέραιο (κάτι που ισχύει για παράδειγμα στην OCaml). Από αυτό, ο εξαγωγέας τύπων μπορεί να εξάγει ότι ο τύπος της x+1 είναι ακέραιος, που σημαίνει ότι η result είναι ακέραιος και επομένως η τιμή επιστροφής της addone είναι ακέραιος. Όμοια, επειδή ο + απαιτεί και τα δύο ορίσματά του να έχουν τον ίδιο τύπο, η x πρέπει να είναι ακέραιος και επομένως η addone δέχεται σαν όρισμα έναν ακέραιο.

Στην επόμενη γραμμή όμως, η result2 υπολογίζεται προσθέτοντας τον δεκαδικό "1.0" (αριθμητική κινητής υποδιαστολής), προκαλώντας σύγκρουση με τη χρήση της x για ακέραιες εκφράσεις και εκφράσεις κινητής υποδιαστολής ταυτόχρονα. Μια τέτοια κατάσταση θα προκαλέσει ένα σφάλμα χρόνου μεταγλώττισης. Σε μια διαφορετική γλώσσα, η result2 θα μπορούσε να έχει έμμεσα δηλωθεί σαν μεταβλητή κινητής υποδιαστολής και η πρόσθεση θα μετέτρεπε έμμεσα τη x σε αριθμό κινητής υποδιαστολής. Συνήθως οι γλώσσες που υποστηρίζουν εξαγωγή τύπων στο βαθμό του παραπάνω παραδείγματος, δεν υποστηρίζουν τέτοιες έμμεσες μετατροπές τύπων. Σε αυτό το σημείο φαίνεται η διαφορά μεταξύ εξαγωγής τύπων, που δεν περιλαμβάνει μετατροπή τύπων, και έμμεσης μετατροπής τύπων (implicit type conversion), που άμεσα μετατρέπει τα δεδομένα σε έναν άλλο τύπο δεδομένων, συχνά χωρίς περιορισμούς.

Τυπική περιγραφή

Η εξαγωγή τύπων μπορεί να βρει αυτόματα είτε ολόκληρο είτε μέρος του τύπου μιας έκφρασης στο χρόνο εκτέλεσης. Συνήθως ο μεταγλωττιστής μπορεί να εξάγει τον τύπο μιας μεταβλητής ή μιας συνάρτησης, χωρίς ρητές σημειώσεις τύπων από το χρήστη. Αρκετές φορές οι σημειώσεις τύπων μπορούν να παραλειφθούν εντελώς από ένα πρόγραμμα αν το σύστημα εξαγωγής τύπων είναι πολύ ισχυρό ή το πρόγραμμα ή η γλώσσα είναι αρκετά απλά.

Ο μεταγλωττιστής συλλέγει την απαραίτητη πληροφορία για την εξαγωγή ενός τύπου μιας έκφρασης, είτε σαν σύνολο (που έχει αναχθεί) από τις σημειώσεις τύπων των υποεκφράσεών της, είτε μέσω μιας έμμεσης συλλογιστικής των τύπων των διάφορων ατομικών τιμών (π.χ. true : Bool, 42 : Integer, 3.14159 : Real, κλπ.). Ένας μεταγλωττιστής μπορεί, μέσω αυτής της αναγωγής από τις τιμές στις εκφράσεις, να μεταγλωττίσει πλήρως ένα πρόγραμμα χωρίς σημειώσεις τύπων. Σε πολύπλοκες περιπτώσεις προγραμματισμού υψηλής τάξης και πολυμορφισμού, δεν είναι πάντα δυνατό ο μεταγλωττιστής να εξάγει όλη την απαραίτητη πληροφορία και ίσως χρειάζονται σημειώσεις τύπων σε σημεία του προγράμματος για να αποφεύγονται διφορούμενες καταστάσεις.

Παράδειγμα

Για παράδειγμα, έστω η συνάρτηση map της Haskell, που εφαρμόζει μια συνάρτηση σε κάθε στοιχείο μιας λίστας και μπορεί να οριστεί ως εξής:

map f [] = []
map f (first:rest) = f first : map f rest

Φαίνεται ότι η συνάρτηση map παίρνει μια λίστα σαν δεύτερο όρισμα, το πρώτο όρισμα f είναι συνάρτηση που μπορεί να εφαρμοστεί στον τύπο των στοιχείων της λίστας αυτής, και το αποτέλεσμα της map κατασκευάζεται σαν λίστα με στοιχεία που είναι αποτελέσματα της f. Υποθέτοντας τότε ότι μια λίστα περιέχει στοιχεία του ίδιου τύπου, μπορεί να κατασκευαστεί μια υπογραφή τύπου (type signature):

map :: (a -> b) -> [a] -> [b]

όπου η σύνταξη "a -> b" σημαίνει συνάρτηση που δέχεται κάτι τύπου a σαν παράμετρο και παράγει b. Η "a -> b -> c" είναι ισοδύναμη με την "a -> (b -> c)".

Ο εξαγόμενος τύπος της map είναι παραμετρικά πολυμορφικός: οι τύποι των ορισμάτων και των αποτελεσμάτων της f δεν εξάγονται, αλλά μένουν σαν μεταβλητές τύπων, και η map μπορεί να εφαρμοστεί σε συναρτήσεις και λίστες διαφόρων τύπων, αν αυτοί ταιριάζουν κάθε φορά στην αντίστοιχη κλήση της συνάρτησης.

Αλγόριθμος εξαγωγής τύπων των Hindley–Milner

Ο αλγόριθμος που χρησιμοποιήθηκε αρχικά για την εξαγωγή τύπων αποκαλείται (άτυπα) σήμερα σαν "αλγόριθμος Hindley–Milner", αν και ο αλγόριθμος κανονικά θα έπρεπε να αποδίδεται στον Damas και τον Milner[1], που τον ονόμασε "Αλγόριθμο W" ("Algorithm W").

Ο αλγόριθμος αυτός προέρχεται από τον αλγόριθμο εξαγωγής για τον λ-λογισμό με τύπους, που αναπτύχθηκε από τους Haskell Curry και Robert Feys το 1958. Το 1969 ο J. Roger Hindley τον επέκτεινε και απέδειξε ότι ο αλγόριθμος έβρισκε πάντα τον γενικότερο τύπο. Το 1978 ο Robin Milner,[2] ανεξάρτητα από το Hindley, έδωσε έναν ισοδύναμο αλγόριθμο, τον Αλγόριθμο W. Το 1982 o Luis Damas[1] απέδειξε τελικά ότι ο αλγόριθμος του Milner είναι πλήρης και τον επέκτεινε για να υποστηρίζει συστήματα με πολυμορφικές αναφορές (polymorphic references). Ο αλγόριθμος Hindley–Milner που περιγράφεται εδώ υποστηρίζει μια περιορισμένη έκδοση του Συστήματος F (System F).

Ο αλγόριθμος

Ο αλγόριθμος έχει δύο στάδια. Αρχικά παράγονται οι εξισώσεις προς επίλυση και στη συνέχεια το σύστημά τους λύνεται.

Παραγωγή των εξισώσεων

Ο αλγόριθμος που χρησιμοποιείται για την παραγωγή των εξισώσεων μοιάζει με έναν κανονικό ελεγκτή τύπων (type checker), επομένως δίνεται ένας ελεγκτής τύπων για το λ-λογισμό με τύπους:

και

όπου η είναι μια πρωτογενής έκφραση (όπως η "3") και ο είναι ένας πρωτογενής τύπος (όπως ο Ακέραιος, "Integer").

Πρέπει να κατασκευαστεί μια συνάρτηση που να αντιστοιχεί ένα ζεύγος , όπου το είναι περιβάλλον τύπων και ο είναι όρος, σε κάποιον τύπο . Θεωρείται ότι αυτή η συνάρτηση είναι ήδη ορισμένη για πρωτογενείς τύπους και όρους. Οι άλλες περιπτώσεις είναι:

  • όπου το ανήκει στο
  • όπου και
  • όπου

Μέχρι στιγμής δεν έχει οριστεί τι γίνεται όταν δε συμφωνούν κάποιες συνθήκες. Αυτό συμβαίνει γιατί στον απλό αλγόριθμο ελέγχου τύπων, ο έλεγχος απλά αποτυγχάνει όταν εμφανιστεί λάθος.

Στη συνέχεια αναπτύσσεται ένας πιο πολύπλοκος αλγόριθμος που μπορεί να χειριστεί μεταβλητές τύπων και περιορισμούς (constraints) σε αυτές. Το σύνολο T των πρωτογενών τύπων επεκτείνεται για να περιλαμβάνει ένα άπειρο σύνολο από μεταβλητές, που σημειώνονται με τα πεζά γράμματα

Δείτε το [3] για περισσότερες λεπτομέρειες.

Επίλυση των εξισώσεων

Η επίλυση των εξισώσεων προχωρά μέσω ενοποίησης (unification), που αποδεικνύεται ένας σχετικά απλός αλγόριθμος. Η συνάρτηση λειτουργεί σε εξισώσεις τύπων και επιστρέφει μια δομή που ονομάζεται "αντικατάσταση" ("substitution"). Μια αντικατάσταση είναι απλά μια αντιστοίχιση από μεταβλητές τύπων σε τύπους. Οι αντικαταστάσεις μπορούν να συντεθούν και να επεκταθούν.

Η ενοποίηση του κενού συνόλου εξισώσεων είναι εύκολη: , όπου η είναι η ταυτοτική αντικατάσταση.

Η ενοποίηση μιας μεταβλητής με έναν τύπο γίνεται ως εξής: , όπου ο είναι ο τελεστής σύνθεσης αντικαταστάσεων και το είναι το σύνολο των περιορισμών που παραμένουν, στο οποίο έχει εφαρμοστεί η νέα αντικατάσταση .

Φυσικά, .

Η πιο ενδιαφέρουσα περίπτωση είναι και αυτή που μένει .

Ένα απλό παράδειγμα είναι το a[i] = b[i] (έστω σε σύνταξη όπως της C). Αρχικά ο αλγόριθμος Hindley–Milner θα έβρισκε ότι η i πρέπει να είναι ακέραιου τύπου (int), στη συνέχεια ότι η 'a' πρέπει να είναι "πίνακας από " και η 'b' πρέπει να είναι "πίνακας από ". Στη συνέχεια, επειδή υπάρχει ανάθεση από σε , η πρέπει να είναι του ίδιου τύπου με τη (αν δεν υπάρχει έμμεση μετατροπή τύπων). Ισχύει ότι τελικά η πρέπει να είναι τουλάχιστον υπερτύπος της .

Αναφορές

  1. 1,0 1,1 Damas, Luis; Milner, Robin (1982), «Principal type-schemes for functional programs», POPL '82: Proceedings of the 9th ACM SIGPLAN-SIGACT symposium on Principles of programming languages, ACM, σελ. 207–212, http://groups.csail.mit.edu/pag/6.883/readings/p207-damas.pdf 
  2. Milner, Robin (1978), «A Theory of Type Polymorphism in Programming», Jcss 17: 348–375 
  3. Pierce, Benjamin C. (2002), «Chapter 22», Types and Programming Languages, MIT Press, ISBN 0-262-16209-1 

Εξωτερικοί σύνδεσμοι

  • e-mail του Roger Hindley, σχετικά με την ιστορία της εξαγωγής τύπων (Αγγλικά)
  • Δημοσίευση του Luca Cardelli, περιγράφει τον αλγόριθμο, περιλαμβάνει υλοποίηση σε Modula-2 (Αγγλικά)
  • Υλοποίηση της εξαγωγής Hindley-Milner σε Scala, του Andrew Forrest (πρόσβ. 30 Ιουλίου 2009) (Αγγλικά)
  • What is Hindley-Milner? (and why is it cool?) Εξηγεί τον αλγόριθμο Hindley-Milner, παραδείγματα σε Scala (Αγγλικά)

Read other articles:

  لمعانٍ أخرى، طالع الإمبراطورة (توضيح). يفتقر محتوى هذه المقالة إلى الاستشهاد بمصادر. فضلاً، ساهم في تطوير هذه المقالة من خلال إضافة مصادر موثوق بها. أي معلومات غير موثقة يمكن التشكيك بها وإزالتها. (يوليو 2017) الامبراطورة النوع دراما تأليف فجر السعيد إخراج نور الضوي بطول

 

Кубок Франции по футболуфр. Coupe de France de football Основан 1918; 105 лет назад (1918) Регион Франция Монако Число участников 8 506 Действующий победитель Тулуза (1) Наиболее титулован Пари Сен-Жермен (14) Телекомпании France Télévisions Сайт www.fff.fr // Coupe de France 2023/24 Ку́бок Фра́нции по ф...

 

Abitibi OesteAbitibi-Ouest Municipio regional de condado Ubicación del MRC de Abitibi Oeste en QuebecCoordenadas 48°45′00″N 79°10′00″O / 48.75, -79.1667Capital La SarreCiudad más poblada La SarreEntidad Municipio regional de condado • País  Canadá • Provincia  Quebec • Región Abitibi-Témiscamingue • Sede La SarrePrefecto Jaclin BéginSubdivisiones 870Fundación 01.01.1982Superficie   • Total 3630 km² • T...

Village in Greater Poland Voivodeship, PolandRóżyczkaVillageRóżyczkaCoordinates: 51°11′02″N 17°56′52″E / 51.18389°N 17.94778°E / 51.18389; 17.94778Country PolandVoivodeshipGreater PolandCountyKępnoGminaTrzcinica Różyczka [ruˈʐɨt͡ʂka] is a village in the administrative district of Gmina Trzcinica, within Kępno County, Greater Poland Voivodeship, in west-central Poland.[1] References ^ Central Statistical Office (GUS) - TERYT (Nation...

 

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Crazy Moon film – news · newspapers · books · scholar · JSTOR (December 2018) (Learn how and when to remove this template message) 1987 Canadian filmCrazy MoonDirected byAllan EastmanWritten byTom BerryStefan WodoslawskyProduced byFranco BattistaTom BerryS...

 

Australian politician The HonourableNick McKennaLeader of the Opposition in the SenateIn office11 June 1951 – 17 August 1966Preceded byBill AshleySucceeded byDon WilleseeMinister for HealthIn office18 June 1946 – 19 December 1949Prime MinisterBen ChifleyPreceded byJames FraserSucceeded byEarle PageMinister for Social ServicesIn office18 June 1946 – 19 December 1949Prime MinisterBen ChifleyPreceded byJames FraserSucceeded byBill SpoonerSenator for TasmaniaIn of...

Final Piala FA 1990TurnamenPiala FA 1989–1990 Manchester United Crystal Palace Final Manchester United Crystal Palace 3 3 setelah perpanjangan waktuTanggal12 Mei 1990StadionStadion Wembley, LondonWasitAllan Gunn (Sussex)Penonton80.000Ulangan Crystal Palace Manchester United 1 0 Tanggal17 Mei 1990StadionStadion Wembley, LondonWasitAllan Gunn (Sussex)Penonton80.000← 1989 1991 → Final Piala FA 1990 adalah pertandingan sepak bola antara Manchester United dan Crystal Palace yang dise...

 

Private Christian junior college in Arkansas This article includes a list of general references, but it lacks sufficient corresponding inline citations. Please help to improve this article by introducing more precise citations. (October 2015) (Learn how and when to remove this template message) Crowley's Ridge CollegeTypePrivate collegeEstablished1964Religious affiliationChurch of ChristPresidentRichard JohnsonStudents197 (Fall 2021)[1]LocationParagould, Arkansas, U.S.CampusRural, 150...

 

Painting by Giovanni Bellini Madonna and Child with St. John the Baptist and a Female SaintArtistGiovanni BelliniYearbefore 1504Mediumoil on panelDimensions54 cm × 76 cm (21 in × 30 in)LocationGallerie dell'Accademia, Venice The Madonna and Child with St. John the Baptist and a Female Saint or the Giovanelli Sacred Conversation is an oil painting on panel by Giovanni Bellini, dated to before 1504. It is kept in the Gallerie dell'Accademia of Venice....

ما الأحلام التي ربما تأتي (بالإنجليزية: What Dreams May Come)‏  الصنف فيلم رومانسي[1][2]،  وفيلم فنتازيا[1][2]،  وفيلم دراما،  وفيلم مقتبس من عمل أدبي  [لغات أخرى]‏  تاريخ الصدور 199826 نوفمبر 1998 (ألمانيا)  مدة العرض 108 دقيقة  البلد الولايات المتحدة...

 

Archeological site of Cyrene Architecture in Libya spans thousands of years and includes ancient Roman sites, Islamic architecture, and modern architecture. Roman Tripoli was founded as a Phoenician colony in the 7th century BC[1] and Tripolitania became a Roman province after the destruction of Carthage in 146 BC.[2] Today, the ancient sites of Cyrene, Leptis Magna, and Sabratha are UNESCO World Heritage Sites.[3][4][5] Other Roman remains include the ...

 

Julian May Información personalNacimiento 10 de julio de 1931 Chicago (Estados Unidos) Fallecimiento 17 de octubre de 2017 (86 años)Bellevue (Estados Unidos) Nacionalidad EstadounidenseReligión Iglesia católica FamiliaCónyuge T. E. Dikty Información profesionalOcupación Escritora, novelista, biógrafa, escritora de ciencia ficción y escritora de literatura infantil [editar datos en Wikidata] Julian Clare May (Chicago, 10 de julio de 1931 – Bellevue, 17 de octubre de 2017) ...

Untuk tokoh bernama sama atau bernama mirip, lihat Catherine Johnson (disambiguasi). Katherine JohnsonKatherine Johnson pada 2008LahirKatherine Coleman(1918-08-26)26 Agustus 1918White Sulphur Springs, Virginia Barat, ASMeninggal24 Februari 2020(2020-02-24) (umur 101)Newport News, Virginia, ASTempat tinggalHampton, VirginiaKebangsaanAmerikaPendidikanWest Virginia State CollegeB.S. (summa cum laude), 1937Mathematika & Bahasa Prancis[1]PekerjaanFisikawan, matematikawanTempat ker...

 

  Grand Prix Austria 2022Detail lombaLomba ke 13 dari 20Grand Prix Sepeda Motor musim 2022Tanggal20–21 Agustus 2022Nama resmiCryptoData Motorrad Grand Prix von ÖsterreichLokasiRed Bull RingSpielberg, Styria, AustriaSirkuitFasilitas balapan permanen4.348 km (2.702 mi)MotoGPPole positionPembalap Enea Bastianini DucatiCatatan waktu 1:28.772 Putaran tercepatPembalap Jorge Martín DucatiCatatan waktu 1:29.854 di lap 8 PodiumPertama Francesco Bagnaia DucatiKedua Fabio Quartar...

 

Albero a gomiti di un motore a quattro tempi a disposizione screamer (rosso), pistoni (grigi) nei loro cilindri (blu) e volano (nero) Alberi a gomiti per motori marini della Continental engine, 1942 L'albero a gomiti, od albero a collo d'oca[1], è un albero motore dalla caratteristica forma dovuta alle manovelle sui cui perni s'infulcrano le bielle. Indice 1 Descrizione 1.1 Tipi di alberi a gomiti 2 Costruzione 2.1 Tecniche produttive 2.2 Accorgimenti 2.2.1 Generali 2.2.2 Solo per i ...

Lighthouse in Ohio, US This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Toledo Harbor Light – news · newspapers · books · scholar · JSTOR (June 2009) (Learn how and when to remove this template message) LighthouseToledo Harbor Light LocationToledo Harbor, Jerusalem Township, Lucas County, OhioCoordinates4...

 

Autonomous multi-arts complex and museum in Bhopal, India Bharat BhavanBharat Bhavan entry gate in 2015Formation13 February 1982 (1982-02-13)Legal statusFoundationPurposeVisual arts, performing arts, folk art, literatureLocationJ. Swaminathan Marg, Shamla Hills, near Upper Lake, BhopalMain organBharat Bhavan TrustWebsitebharatbhawan.org/index.htmlBharat Bhavan is an autonomous multi-arts complex and museum in Bhopal, India, established and funded by the Government of Madhya Pra...

 

Russian actress and former ballerina Olga LomonosovaLomonosova at the play Passion for the Queen of Spades in 2018.Born (1978-05-18) 18 May 1978 (age 45) [1]Donetsk, Ukrainian USSR, USSR[1]CitizenshipUkrainia → RussiaOccupation(s)Former Ballet dancer, actressYears active2001–present Olga Olegovna Lomonosova (Russian: Ольга Олеговна Ломоносова; born 18 May 1978) is a Russian actress and former ballerina. She is best known for her roles as Ki...

Vistula Gorge of Lesser PolandGorge of the Vistula in Kazimierz DolnyThe location map of the Gorge The Lesser Poland Gorge of the Vistula (Polish: Małopolski Przełom Wisły) is a geographical region located in central-eastern Poland, which administratively belongs to three Polish voivodeships – Lublin, Masovian, and Świętokrzyskie. The Gorge is for the most part made by the valley of the Vistula, with two Polish uplands on both sides of the river – Lesser Poland (or Małopolska) Uplan...

 

Species of bird Blue-capped rock thrush Conservation status Least Concern (IUCN 3.1)[1] Scientific classification Domain: Eukaryota Kingdom: Animalia Phylum: Chordata Class: Aves Order: Passeriformes Family: Muscicapidae Genus: Monticola Species: M. cinclorhyncha Binomial name Monticola cinclorhyncha(Vigors, 1831) Synonyms Monticola cinclorhynchus The blue-capped rock thrush (Monticola cinclorhyncha) is a species of bird in the family Muscicapidae. Description Molem, Goa, In...

 

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!