Die statische Eingabe erfordert nicht unbedingt Zeremonien

Anmerkung des Übersetzers: Derzeit bereite ich Materialien für den versprochenen Artikel über Monaden vor. Leider nimmt dies viel Zeit in Anspruch, ganz zu schweigen davon, dass ich immer noch die Hauptarbeit erledigen und Zeit für die Familie aufwenden muss, aber der Prozess dauert noch an. In der Zwischenzeit präsentiere ich Ihnen eine Übersetzung einer kleinen frischen Notiz eines wunderbaren Genossen Mark Seemann, die ich neugierig fand .


Ich bin oft Teil einer langen und hitzigen Debatte über statisches und dynamisches Tippen. Ich betrachte mich auf jeden Fall als Befürworter des statischen Tippens, aber in diesem Artikel geht es nicht um die Vorteile des statischen Tippens. Ziel des Artikels ist es, ein häufiges Missverständnis über statisch typisierte Sprachen zu beseitigen.


Zeremonie


Menschen, die dynamisch getippte Sprachen gegenüber statisch getippten Sprachen bevorzugen, betonen häufig die Tatsache, dass die fehlende Zeremonie sie produktiver macht. Das klingt logisch, ist aber eine falsche Zweiteilung.


Eine Zeremonie ist das, was Sie tun, bevor Sie anfangen, das zu tun, was Sie wirklich tun wollten.

Venkat subramaniam

Dynamisch typisierte Sprachen erwecken den Eindruck, dass sie keine besonderen Zeremonien benötigen. Daraus lässt sich jedoch nicht schließen, dass statisch typisierte Sprachen diese benötigen. Leider gehören alle gängigen statisch typisierten Sprachen derselben Familie an und bedürfen einer Zeremonie. Ich denke, die Leute extrapolieren, was sie über sie wissen, und schließen fälschlicherweise daraus, dass alle statisch typisierten Sprachen notwendigerweise mit einer Overhead-Zeremonie verbunden sind.


Dies führte mich zu der Idee, dass es eine unglückliche Zeremonienzone gibt :



Natürlich ist dieses Diagramm nur eine Vereinfachung, aber ich hoffe, dass es das Wesentliche demonstriert. C ++, Java und C♯ sind Sprachen, die eine Zeremonie erfordern. Rechts von ihnen befinden sich Sprachen, die wir als transzeremoniell bezeichnen könnten, einschließlich F♯ und Haskell.


Im Folgenden werde ich den Code in verschiedenen Sprachen zeigen. Wir werden die Zeremonie wie oben definiert betrachten und dabei auf den Umfang der vorbereitenden Arbeiten achten, die durchgeführt werden müssen, z. B. das Erstellen neuer Dateien, das Deklarieren von Klassen, das Deklarieren von Typen usw. Ich habe den Code, der nicht mit dem diskutierten Thema zusammenhängt, belassen, um zu betonen, was ich vermitteln möchte.


Eine kleine Anzahl von Zeremonien in JavaScript


Nehmen wir an, wir haben eine Liste mit Zahlen und noch eine Nummer. Diese Zahl gibt an, wie viele Elemente aus der Liste entfernt werden sollen. Sie müssen Elemente auf der linken Seite löschen, bis die Summe der gelöschten Nummern größer als diese Nummer ist. Das Ergebnis ist der Rest der Liste.


> consume ([1,2,3], 1);
[ 2, 3 ]
> consume ([1,2,3], 2);
[ 3 ]
> consume ([1,2,3], 3);
[ 3 ]
> consume ([1,2,3], 4);
[]

, 1, 2, 3, quantity 2 3 . , quantity 4, , . , 1 3.


JavaScript :



JavaScript-, , , , . 17 , . , , , . JavaScript . , , , .


C♯


JavaScript C♯. C♯ :



, . . , , , , .


. int . , long?


:



short? . decimal? . byte? .


, .


F♯


F♯ :



, . , :


quantity: ^a -> (seq< ^b> -> seq< ^b>)
  when ( ^a or  ^b) : (static member ( + ) :  ^a *  ^b ->  ^a) and
        ^a : (static member get_Zero : ->  ^a) and  ^a : comparison

, , , , . , decimal, :


> consume 2 [1;2;3];;
val it : seq<int> = seq [3]

> consume 2m [1m;2m;3m];;
val it : seq<decimal> = seq [3M]

, . consume "foo" [true;false;true] .


F♯ ( , C♯), : . , " ". , , , , - .


Haskell


Haskell:



. . GHCi , :


> :t consume
consume :: (Foldable t, Ord a, Num a) => a -> t a -> [a]

F♯ , . Foldable ( , . ), , Ord Num. Num , Ord — .


, F♯ Haskell , . , , C♯ Java. , .



, C++, Java C♯. , , , , .


, .


, F♯ Haskell. -. : .

Source: https://habr.com/ru/post/de482834/


All Articles