Die folgenden zwei Funktionen sind sehr ähnlich. Sie lesen aus [String] n Elementen, entweder [Int] oder [Float]. Wie kann ich den gemeinsamen Code ausschließen? Ich kenne keinen Mechanismus in Haskell, der Übergabetypen als Argumente unterstützt.
%Vor%Ich bin Anfänger auf Haskell, daher sind Kommentare zu meinem Code willkommen.
Haskell unterstützt einen hohen Grad an Polymorphie. Insbesondere
%Vor%hat den Typ
%Vor%also
%Vor% Sie müssen den Typ nicht spezialisieren. Haskell wird automatisch den allgemeinsten möglichen Typ ableiten, und der readAny
hier wird tun, was Sie wollen.
Es ist nicht möglich, Typen als Argumente in Haskell zu übergeben. Selten würden Sie brauchen. Für die wenigen Fälle, in denen es notwendig ist, können Sie das Verhalten simulieren, indem Sie einen Wert mit dem gewünschten Typ übergeben.
Haskell hat einen "Rückgabetyp-Polymorphismus", also sollten Sie sich wirklich nicht darum kümmern, "den Typ zu übergeben" - die Wahrscheinlichkeit ist, dass Funktionen tun, was Sie wollen, ohne dass Sie es ihnen sagen.
Grundsätzlich möchten Sie den Typ nicht explizit deklarieren. Lassen Sie statt dessen den Typ deklarieren und lassen Sie die Inferenz-Engine für sich übernehmen. Außerdem glaube ich, dass Sie die Karte zusammenfalten. So würde ich mich nähern.
%Vor% Um nur n Dinge aus dem Stream zu lesen, verwenden Sie take