Ein paar Fragen zu Haskell

Ugi25

Mitglied
Hi,

ich habe hier eine Aufgabe zu lösen, sind aber Basics.

1."Warum ist (min -2 0) kein gültiger Haskell-Ausdruck in Prelude?"
2. "Warum ist der Ausdruck (mod 1 0) fehlerhaft?
3. "Warum ist (0.1 == 0.3/3) oder 0,9 ==3*(0.3) gleich FALSE?"
4. "Warum sind die Ausdrücke quot 1.0 3 und 3^1.0 fehlerhaft"?

zu 1. durch 0 nicht erlaubt
zu 2. Teilung durch 0 nicht erlaubt
zu 3. erst wenn man 0,3/3 bzw. 3*0.3 in komplett in Klammern setzt, ist es TRUE
zu 4. weiß ich nicht

Kann mir bitte einer weiterhelfen? Sind meine Ansätze richtig?
 

httpdigest

Top Contributor

Ugi25

Mitglied
Falsch. Was meinst du mit "durch 0 nicht erlaubt"? Was ist "durch 0" nicht erlaubt.

Korrekt.

Nein, falsch.

Typisierung der Literale.

zu 1. Also, wenn ich es so schreibe: "((min (-2) (0))", dann funktioniert es. Es liegt also an den nicht gesetzten Klammern.

zu 3. weil Haskell nicht richtig mit irrationalen Zahlen rechnen kann?
zu 4. analog zu 3?

Wärst du so freundlich mir das bitte zu erklären?
 

httpdigest

Top Contributor
zu 1. Also, wenn ich es so schreibe: "((min (-2) (0))", dann funktioniert es. Es liegt also an den nicht gesetzten Klammern.
Das erklärt irgendwie immer noch nicht, was du bei 1. (also "(min -2 0)") mit "zu 1. durch 0 nicht erlaubt" meintest.
Wie dem auch sei, jedenfalls:

1. Warum (min -2 0) nicht funktioniert, (min (-2) 0) hingegen aber schon, liegt daran, wie der unäre (und einzige unäre) Operator in Haskell implementiert ist: In Haskell ist (-a) Shorthand für (negate a), also die Funktionsanwendung der Funktion `negate` mit dem Argument `a`.
Tatsächlich gibt es in Haskell (anders als in jeder anderen sinnvollen Sprache) keine negativen Nummernliterale. `-2` bedeutet für den Lexer also nicht die Zahl "minus zwei", sondern "Funktionsapplikation von `negate` auf das Argument `2`".
Das heisst, dass die beiden Ausdrücke (min -2 0) und (min - 2 0) (Leerzeichen zwischen `-` und `2`) in Haskell absolut identisch sind. Und somit ist hier auch schon deutlich, dass das dann dasselbe ist wie (min negate 2 0), was, wenn wir explizit klammern, dasselbe ist wie
(((min negate) 2) 0)

zu 3.: In Java ist 0.3/3 auch nicht 0.1 (das liegt einfach an Rundungsungenauigkeiten von IEEE 754). Also: Man kann 0.1 binär nicht exakt darstellen.

zu 4.: Beide Argumente müssen von einem integralen Typ sein. -> http://zvon.org/other/haskell/Outputprelude/quot_f.html
 

Neue Themen


Oben