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  

HaskellAnfänger2

Gepostet:
08.02.2011 22:59

   
Das hört sich super an. Ich bin immernoch begeistert von der schnellen Hilfe, ihr seit super!

Nun habe ich nur noch ein Problem, und zwar, dass als Fehlermeldung sowas kommt:

ERROR file:.\io Eliza(1).hs:44 - Type error in application
*** Expression : lookup value hilfsliste
*** Term : value
*** Type : Int
*** Does not match : Integer

Wenn ihr mir hier auch noch weiterhelfen könntet wäre ich fertig und gleichzeitig unendlich dankbar :)

Viele Grüße,

HaskellAnfänger
Zum Seitenanfang    
 
Siracusa

Gepostet:
08.02.2011 23:52

   
Füge mal zu allen Funktionen Typsignaturen hinzu, also bspw. hilfsliste :: [(Int, String)]. Wenn du diese weglässt bestimmt der Compiler zwar selbst einen Typ, alle Zahlen werden standardmäßig aber zu Integer spezialisiert. Wenn dann an andere Stelle ein Int gefordert ist gibt es den Typfehler. Außerdem helfen explizite Typsignaturen Fehler schneller zu finden und das Schreiben der Funktionen klappt oft auch viel besser, wenn man sich darüber im Klaren ist, welchen Typ die Funktion zum Schluss haben soll.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
HaskellAnfänger2

Gepostet:
09.02.2011 16:10

   
Ok nun habe ich wieder ein anderes Problem. Und ich verstehe diese Fehlermeldungen irgendwie überhauptnicht. Könnt ihr mir bitte nochmal helfen?

ERROR file:.\io Eliza(richtig).hs:19 - Type error in application
*** Expression : elizahelp (words (großschreiben str)) elizadatenbank
*** Term : elizadatenbank
*** Type : [([Char],[Char])]
*** Does not match : [(a,IO ())]


Hierbei ist elizadatenbank eine Liste und elizahelp eine Funktion, die den eingegebenen String mit der liste vergleicht. So grob gesagt, aber es ist natürlich ein bisschen komplizierter.

Vielen Danke im Voraus,

HaskellAnfänger
Zum Seitenanfang    
 
Landei

Gepostet:
09.02.2011 16:16

   
Ohne Code können wir nur rumraten:

Hast du mal bei elizahelp den Typ angegeben? Funktioniert die Funktion elizahelp für sich alleine? Ist der Typ [([Char],[Char])] a.k.a. [(String,String)] für elizadatenbank korrekt?

Zum Seitenanfang    
 
HaskellAnfänger2

Gepostet:
09.02.2011 20:22

   
Darf ich das per e-mail schicken? :)
Zum Seitenanfang    
 
Landei

Gepostet:
10.02.2011 08:52

   
Lad es doch irgendwo hoch (irgendein Filehoster oder pastbin.de oder so), dann können alle mitraten :-)
Zum Seitenanfang    
 
HaskellAnfänger2

Gepostet:
11.02.2011 15:18

   
Also das hier ist mein Quelltext:

import System.Random
import Char

-- Oberen Teil nicht verändern!

start
= do line <- getLine
res <- return (line == "exit")
if (not res) then do putStrLn (eliza line)
start
else return ()

-- Ab hier dürft Ihr den Quelltext verändern!


eliza str = elizahelp (words (großschreiben str)) elizadatenbank


-- Klein-/Großschreibung wird irrelevant

großschreiben [] = []
großschreiben (x:xs) = (toUpper x):(großschreiben xs)


-- Durchsuchen der Datenbank auf Stichworte

enthalten [] ((a,b):ys) = False
enthalten (x:xs) ((a,b):ys)
|x == a = True
|otherwise = enthalten xs ((a,b):ys)


-- Auswerfen von der Antwort ( zweite Liste / b)

elizahelp (x:xs) [] = roll
elizahelp (x:xs) ((a,b):ys)
|enthalten (x:xs) ((a,b):ys) == True = b
|otherwise = elizahelp (x:xs) ys

rollDice :: IO Int
rollDice = getStdRandom (randomR (1,6))

roll = do
value <- rollDice
print $ lookup value hilfsliste

hilfsliste :: [(Int, String)]
hilfsliste = [(1,"Weiter"),(2,"Danke"),(3,"Erzaehlen sie mehr"),(4,"Fahren sie fort"),(5,"Und weiter?"),(6,"Da müssen sie mir schon mehr erzaehlen")]

elizadatenbank = [("HALLO","Wie geht es Ihnen?"),("MUSIK","Spielen Sie auch ein Instrument?"),("GUT","Das ist schoen. Was haben Sie heute gemacht?"),("MITTELMÄßIG", "Dann fangen Sie doch mit dem positiven an!"),("ARBEIT","Was ist Ihr Beruf? Erzaehlen Sie mir mehr!"),("SCHULE","In welche Klasse gehen Sie?"),("SPORT","Welche Sportart betreiben Sie?"),("FUßBALL","Ich sehe mir gerne Fußball im Fernsehen an. Seit wann spielen Sie?")]


Und momentan bekomm ich diesen Fehler:

ERROR file:.\Eliza_hilfe.hs:16 - Type error in application
*** Expression : elizahelp (words (großschreiben str)) elizadatenbank
*** Term : elizadatenbank
*** Type : [([Char],[Char])]
*** Does not match : [(a,IO ())]


Es geht jetzt nicht darum mir eine besser möglichkeit zu zeigen, da ich das auch nachvollziehen muss. Eigentlich geht es mir nur darum das ich nicht mehr einen fehler bekomme und das Eliza so läuft.

Vielen Danke im Voraus,

HaskellAnfänger

Zum Seitenanfang    
 
Siracusa

Gepostet:
11.02.2011 17:58

   
Hallo,

elizadatenbank :: [(String, String)] und du rufst "elizahelp (words (großschreiben str)) elizadatenbank" auf, d.h. der zweite Parameter von elizahelp hat den Typ [(String, String)]. Dann weiter:
elizahelp (x:xs) [] = roll
elizahelp (x:xs) ((a,b):ys)
|enthalten (x:xs) ((a,b):ys) == True = b
Durch den Aufruf oben wissen wir, dass (a,b) :: (Sting, String), und das Ergebnis des zweiten Falls ist b, also muss der Ergebnistyp von elizahelp String sein. Im ersten Fall gibst du aber roll als Ergebnis zurück, das hat den Typ IO (). Da dieselbe Funktion in jedem Fall den selben Rückgabetyp haben muss, gibt es den Typfehler.

Eine Möglichkeit diesen Fehlerfall zu beheben wäre im zweiten Fall statt "b" "print b" zurückzugeben, da du um das IO nicht herumkommst, wenn du es einmal innerhalb der Funktion benutzt hast.

Ich möchte aber nochmal eindringlich darauf hinweisen jede Funktion mit einer Typsignatur zu versehen! Damit lokalisiert du Typfehler schon innerhalb einer fehlerhaften Funktion, nicht erst irgendwo beim Aufruf.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
HaskellAnfänger2

Gepostet:
11.02.2011 22:37

   
Soweit so gut, aber nun gibt mein eliza ein problem, nähmlich in dem vordefinierten text oben. Das putStrLn (eliza line) ist das Problem.


start
= do line <- getLine
res <- return (line == "exit")
if (not res) then do putStrLn (eliza line)
start
else return ()

-- Ab hier dürft Ihr den Quelltext verändern!


ERROR file:.\io Eliza(richtig).hs:9 - Type error in application
*** Expression : putStrLn (eliza line)
*** Term : eliza line
*** Type : IO ()
*** Does not match : [Char]


Mach ich irgendwas falsch oder geht das bei euch auch nicht?

Viele Grüße,

HaskellAnfänger
Zum Seitenanfang    
 
Siracusa

Gepostet:
11.02.2011 23:11

   
Das fällt mir jetzt erst auf, wenn ihr den oberen Teil nicht verändern dürft, kannst du gar kein IO verwenden. Dann muss eliza nämlich den Typ String -> String haben. Daraus folgt dann aber auch, dass du keine "echten" Zufallszahlen benutzen kannst. Die einzige Möglichkeit einen Zufallszahlengenerator zu erzeugen wäre demnach über mkStdGen. Der übergebene Int sollte dann aber für unterschiedliche Texteingaben möglichst verschieden sein, damit die erzeugten Zufallszahlen noch einigermaßen gut verteilt sind.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 

vorherige Seite 1 2