Oft sind Definitionen in where
Klauseln zu vermeiden, sich zu wiederholen, wenn ein Unterausdruck mehr als einmal in einer Definition vorkommt. In einem solchen Fall hält der Programmierer die lokale Definition für einen einfachen Stellvertreter zum Schreiben der Inline-Sub-Ausdrücke. Normalerweise würden Sie die Inline-Unterausdrücke nicht explizit eingeben, daher geben Sie auch nicht die where
-Definition ein. Wenn Sie dies tun, um beim Tippen zu sparen, würde die Typdeklaration alle Ihre Ersparnisse zunichte machen.
Es scheint ziemlich üblich, Lerner von Haskell mit Beispielen dieser Form where
einzuführen, so dass sie weiter denken, dass "normaler Stil" Typdeklarationen für lokale Definitionen nicht geben soll. Zumindest war es meine Erfahrung, Haskell zu lernen. Ich habe seither festgestellt, dass viele meiner Funktionen, die kompliziert genug sind, um einen where
Block zu benötigen, ziemlich undurchschaubar werden, wenn ich den Typ der lokalen Definitionen nicht kenne, also versuche ich, sie immer jetzt zu tippen; Selbst wenn ich denke, dass der Typ offensichtlich ist, während ich den Code schreibe, ist es vielleicht nicht so offensichtlich, wenn ich es lese, nachdem ich es eine Zeit lang nicht angeschaut habe. Eine kleine Anstrengung für meine Finger wird fast immer durch ein oder zwei Fälle von typischem Rückschluss in meinem Kopf aufgewogen!
Ingo Antwort gibt einen guten Grund für bewusst keinen Typen auf eine lokale Definition zu geben, aber ich vermute, der Hauptgrund ist, dass viele Programmierer die Daumenregel, dass Typ assimiliert haben Erklärungen für Top-Level-Definitionen zur Verfügung gestellt werden, aber nicht für lokale Definitionen aus der Art, wie sie Haskell gelernt haben.
Ich kann die Frage nicht beantworten, ob es Kompilieren schneller macht oder nicht, aber es ist immer gute Praxis, Typ-Signaturen auszugeben, wenn es eine nicht-triviale Funktion ist. – Wes
Außerdem müssen viele dieser lokalen Definitionen auf Typvariablen aus dem äußeren Bereich zugreifen, was dazu führt, dass der Code mit 'asTypeOf' und Freunden überfüllt wird, es sei denn, Sie verwenden' ScopedTypeVariables'. – Vitus
Wenn Ihre Funktion wichtig genug ist, um eine Typdeklaration zu erhalten, warum sollten Sie sie nicht zu einem erstklassigen Bürger machen? – rotskoff