Gepostet: |
Kg in Pfund umrechnen mit dem algebraischen Datentyp data | ||||||||||
ich soll kg in Pfund und Pfund in kg umrechnen. 1 Pfund = 0,453 592 370 kg. Ich habe hier eine Funktion geschrieben, die das machen soll. Aber als Fehler wird angezeigt \"umrechne\" multiply defined\"
|
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Was genau sollen deine Signaturen bedeuten? Gewicht -> Pfund -> Double sind zwei Argumente. Einen Typ \"Pfund\" gibt es nicht, das ist ein Typ-Konstruktor. Der muss übrigens beim Pattern Matching geklammert werden: (Pfund a). Leerzeichen in Doubles sind auch nicht erlaubt. Je nachdem, was du willst, gibt es mehrere Lösungswege. Mit deiner obigen data-Definition kannst du typmäßig nicht zwischen Pfund uns Kg unterscheiden. Möglich wäre eine gegenseitige Umrechnung, also jedes Pfund-Gewicht in ein Kg-Gewicht umzurechnen und umgekehrt, aber dieses Modell würde schon versagen, wenn eine dritte Gewichtseinheit dazukommt. Besser ist es, Pfund und Kg separat zu definieren:
Natürlich gibt es andere Lösungsmöglichkeiten (z.B. könnte Gewicht als Typklasse definiert werden, oder man könnte Typfamilien verwenden). |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Das letzte Beispiel noch einmal aufgebohrt, so dass man nur eine Umrechnungs-Funktion braucht, und leicht weitere Einheiten hinzufügen kann:
|
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Danke! Selber Klassen & Instanzen davon zuerstellen, damit habe ich mich bisher noch nicht beschäftigt (es gibt ja auch Leute auf #haskell die sagen, dass wenn man selber neue Klassen anlegt nur nicht lange darüber nachgedacht hätte, wie man das Problem sonst lösen könnte). Das sieht aber ziemlich cool aus, werd ich mir mal später näher anschauen. | |||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Die prinzipielle Vorgehensweise ist inzwischen Allgemeingut, selbst wenn man sich Java-Bibliotheken anschaut (etwa JScience): Es hat sich herausgestellt, dass die Einheiten selbständig ansprechbar sein müssen, also nicht \"versteckt\" sein dürfen wie in Xans Entwurf. Davon ausgehend ist obige Version naheliegend - wobei gerade bei Maßeinheiten der Teufel im Detail steckt: Eine ernsthafte Implementierung müsste als zusätzliche Ebene noch Dimensionen und Basiseinheiten (was ich nur implizit über die Methode nachKg mache) berücksichtigen, eventuell auch \"Systeme\" (SI, imperial US, imperial UK). | |||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Was bedeutet diese Dolarzeichen hier? kg $ x * 0.453592370 | |||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Im Beispiel oben könnte man genauso gut kg (x * 0.453592370) schreiben. ($) ist so definiert:
Also wird nur das Argument rechts an die Funktion links übergeben. Hört sich nicht besonders sinnvoll an, spart aber dank der Assoziativität von ($) oft Klammern (da alles rechts als Einheit angesehen wird), und ist bei mehreren Klammerebenen übersichtlicher. Außerdem ermöglicht es Konstrukte wie...
... die du ohne $ nicht schreiben könntest. |
|||||||||||
Zum Seitenanfang | |||||||||||