# Ein paar Fragen zu Haskell



## Ugi25 (20. Dez 2020)

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 (20. Dez 2020)

Ugi25 hat gesagt.:


> zu 1. durch 0 nicht erlaubt


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


Ugi25 hat gesagt.:


> zu 2. Teilung durch 0 nicht erlaubt


Korrekt.


Ugi25 hat gesagt.:


> zu 3.  erst wenn man 0,3/3 bzw. 3*0.3 in komplett in Klammern setzt, ist es TRUE


Nein, falsch.


Ugi25 hat gesagt.:


> zu 4. weiß ich


Typisierung der Literale.


----------



## Ugi25 (20. Dez 2020)

httpdigest hat gesagt.:


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



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 (20. Dez 2020)

Ugi25 hat gesagt.:


> 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


----------

