www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

vorherige Seite 1 2  

Jacke

Gepostet:
30.03.2007 07:01

   
Hmm, wenn ich meinen Rechner nicht geröstet hätte, dann hätte ich ja weiter dran arbeiten können und es hochstellen können. Aber so...

Jammni
Zum Seitenanfang    
 
Blacksoul

Gepostet:
30.03.2007 23:49

   
naja...
abwarten, bis man es das nächste mal wieder brauch *g*
Zum Seitenanfang    
 
Christian

Gepostet:
22.11.2007 19:06

Funktion definieren  
Hi
Ich muss gerade die Programmiersprache Haskell lernen und bin darin Anfänger.
Ich muss eien Belegaufgabe mache:
1) Gesaucht ist die Funktion anzahl::(Eq a)->[a]->Int
a)Geben Sie eine Definition der Funktion anzahl an, die rekursiven Aufrufen von anzahl basiert.
Meine Lösung
anzahl:: a->[a]->Int
anzahl x [x:xs]=ifx==x
then1+anzahlx[xs]
elsex=0

Kommt Fehler in der zeile else
1b Die Funktion anzahl sollL nicht rekursiv sein und eine Superposition sum und map nutzen

Danke würde mich für eure Hilfe freuen und Danke im vorraus
Zum Seitenanfang    
 
Christian

Gepostet:
22.11.2007 19:17

Funktion definieren  
Hi
2) Gesaucht ist die Funktion mische::[a]->[a]->[]

Die zwei gleichlangen nichtleeren Listen
lis1 = [a1,a2,...] und lis2 =[b1,b2,...]

E5rgebnis soll so aussehen

mische[3,5,7][6,4,2] liefert[3,6,5,4,7,2]

3.) Definieren sie eine Funktion arith_m, die bei Anwendung auf eine nichtleere Liste von rationalen Zahlen als den Wert das arithmetische Mittel der zahlen liefert.

Danke würde mich für eure Hilfe freuen und Danke im vorraus
Zum Seitenanfang    
 
Siracusa

Gepostet:
22.11.2007 22:19

   
Hallo,

zu 1 a) Variablennamen dürfen in Funktionsdefinitionen auf der linken Seite nicht mehrfach vorkommen, anzahl x [x:xs] geht also schonmal nicht, ein x muß durch einen anderen Namen ersetzt werden. Dann scheinen in der Funktion im hinteren Teil einige Leerzeichen zu fehlen, ich vermute das ist aber nur durch das Kopieren gekommen. Weiterhin dürfen in Haskell einer Variablen Werte nicht überall mit einem = zugewiesen werden, wie es in deinem else-Zweig gemacht wurde. Dort gibst du einfach das Ergebnis ohne Zuweisung zurück. Im else-Zweig muß übrigens auch die Restliste weiter abgearbeitet werden, sonst bekommst du z.B. beim Aufruf anzahl 1 [2,1,1,1,1] als Ergebnis 0, denn es wird nur geprüft, ob 1==2 ist und dann abgebrochen. Und statt eckigen Klammern mußt du in deinem Fall runde Klammern verwenden. [x:xs] würde bedeuten, x hat einen Typ a, xs dann den Typ Liste von a und [x:xs] wäre dann eine Liste von einer Liste von a. Denn der Doppelpunkt erhält auf der rechten Seite bereits eine Liste.

zu 1 b) map könnte mit einer Funktion f aufgerufen werden, die zwei Argumente x und y erhält und 1 zurückliefert, falls x==y, sonst 0. Erhält map als zweites Argument dann die Liste, deren Elemente gezählt werden sollen, so ist das Endergebnis schonmal eine Liste der Form [1,0,0,0,1,1] o.ä., wobei jede 1 das Auftreten des zu suchenden Elements symbolisiert. Wenn du diese Liste dann noch mit der sum-Funktion aufsummierst, hast du die Anzahl der Elemente.

zu 2.) Die Funktion erhält die beiden Listen, trennt immer das jeweils erste Element ab, verkettet sie hintereinander und hängt dahinter das Ergebnis des rekursiven Aufrufs der Funktion mische an. Vorsicht ist bei unterschiedlich langen Listen geboten, denn es kann sowohl die linke, als auch die rechte Liste länger sein!

zu 3.) Die Funktion sollte nicht schwer sein. Einfach die Summe der Liste bilden, z.B. mit sum, und durch die Länge der Liste (Funktion length) dividieren. Eine rationale Zahl läßt sich in Haskell durch (zähler % nenner) erzeugen.

Soviel erstmal dazu. Bitte bei weiteren Problemen einen neuen Thread starten und nicht einen alten zu einem anderen Thema weiterführen.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Christian

Gepostet:
26.11.2007 03:22

Funktion definiert  
Hi Leute

Ich bin habe versucht eine Definition zu schreiben und bekomme da ein Fehler

Mein Versuch

anzahl:: a->[a]->Int
anzahl a (b:rest)=if a==b
then 1 + anzahl b[rest]
else 0 + anzahl b[rest]

Fehlermeldung

Type Error in Application
Expression: anzahl b[rest]
Term : b
Type : a
Does not match : [a]
Because unification would give infinite type

Danke im vorraus
Zum Seitenanfang    
 
Siracusa

Gepostet:
26.11.2007 15:21

   
Hallo,

gleicher Fehler wie beim letzten Mal. Im rekursiven Aufruf verwendest du wieder eckige Klammern. rest ist bereits eine Liste, mit eckigen Klammern machst du daraus eine Liste von Listen, die zugehörige Funktion hätte also den Typ [a] -> [[a]] -> Int, beim nächsten Aufruf [[a]] -> [[[a]]] -> Int, usw. Also die eckigen Klammern weglassen.

Übrigens sollte doch beim rekursiven Aufruf statt dem b ein a stehen, sonst suchst du nicht das extra übergebene Element in deiner Restliste, sondern immer das Anfangselement der Liste.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Christian

Gepostet:
27.11.2007 22:56

   
Hi Siracusa

Danke für deine Hilfe

Ich wollte jetzt meine Dritte Aufgabe mit dem lösen vom arithm Mittel einer Liste lölsen

Für natürliche Zahklen habe ich die Lösung hinbekommen

arithm xs = conv(summe xs) / (length xs))
where
conv = fromInteger.toInteger

Wenn ich die rationalen Zahlen eingebe funktioniert es nicht.
Ich weiss das man rationale Zahlen mit % erzeugt, weis aber nicht wie ich das in meine Berechnung einbauen kann

Danke

PS Kannst du die Lösung schreiben
Zum Seitenanfang    
 
Christian

Gepostet:
27.11.2007 23:18

   
Hi Siracusa

Kannst du mir auch für dieses Problem die Lösung posten:

anzahl:: a->[a]->Int
anzahl a [b:rest]=if a==b then 1 + anzahl a(rest)
else 0 + anzahl a(rest)

anzahl:: a->[a]->Int
anzahl a (b:rest)=if a==b then 1 + anzahl a(rest)
else 0 + anzahl a(rest)

Beide laufen nicht. Verursachen nur unterschiedliche Felermeldungen.

Christian

Ich weis da nicht mehr weiter
Zum Seitenanfang    
 
Siracusa

Gepostet:
28.11.2007 03:22

   
Hallo nochmals!

zu 1.) "Kannst du die Lösung schreiben" - Ja kann ich, aber das hilft dir nicht wirklich beim Lernen der Sprache. ;-)
Aber ich kann dir insofern helfen, daß ich dich mal in die richtige Richtung schubse.

Die Konvertierungsfunktion ist eigentlich gar nicht nötig, denn die arithm-Funktion soll doch die Signatur [Ratio Int] -> Ratio Int haben, und da wird ohnehin nur mit rationalen Zahlen gerechnet. Statt der Funktion summe (hast du die irgendwo definiert?) kannst du einfach die Funktion sum aus dem Prelude nehmen. Dann bist du schon fast fertig. Nun gilt es nur noch die berechnete Länge von xs von Int nach Ratio Int zu konvertieren. Am einfachsten geht das, indem du eine neue rationale Zahl erzeugst, deren Nenner die Länge und deren Zähler die Zahl Eins ist (<-- und genau hier kannst du den %-Operator dann mal verwenden). Damit wird deine Funktion zum Einzeiler und tut auch schon das, was sie soll. :-)

Damit du mit rationalen Zahlen rechnen kannst, mußt du übrigens import Ratio am Anfang deiner Haskell-Datei ergänzen.

zu 2.) Die letztere Funktion läuft ja nun auch schon fast. Zwei Kleinigkeiten fehlen noch:

anzahl :: Eq a => a -> [a] -> Int
anzahl a [] = 0
anzahl a (b:rest) = if a==b then 1 + anzahl a rest else anzahl a rest

Das "Eq a" nennt sich Kontext und spezialisiert den Typ von a. a darf nun nicht ein beliebiger Typ sein, sondern muß eine Instanz der Klasse Eq sein. Konkret heißt das, man soll Werte vom Typ a miteinander vergleichen können, denn du verwendest ja den Vergleichsoperator ==. Wenn ihr euch noch nicht weiter mit dem Klassen-System von Haskell beschäftigt hat, muß du das jetzt einfach mal hinnehmen.
Die zweite Code-Zeile ist notwendig, damit deine Funktion auch einen Rekursionsanfang hat, nämlich die leere Liste. In der ist kein Element enthalten, daher soll immer 0 zurückgegeben werden.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 

vorherige Seite 1 2