2017-01-21 3 views
-2

aufgerufen wurde Ich bin gerade dabei, einen Weg zu finden, ein "Telefonbuch" zu schreiben. (Es ist eine Aufgabe von der Universität so dass ich einen Tipp zu schätzen wissen würde lieber als eine vollständige Lösung)Zugriff auf eine Funktion, die

ich eine Funktion erstellt, die den Benutzer ermöglicht, in mehreren Namen zu schreiben, wie folgt:

(Es hatte löst so seine , weil wir type TelephoneBook = String -> String)

(enterName "Peter" "4232" (enterName "Alice" "23213" emptyBook)) "" 

Diese dann Peter zurückkehren würde verwenden musste.

Nun soll ich in der Lage sein, auf diese Daten zugreifen und nach einem Namen suchen und dann eine Nummer abrufen. Meine aktuelle Idee ist wie folgt:

searchFkt :: String -> TelephoneBook -> String 
searchFkt a b 
| (a == book "") = a   --Iam fully aware that this doesn't work 
| otherwise = "not found" 

Ich bin mir bewusst, dass der zweite Teil wie das nicht funktioniert (searchFkt :: String -> TelephoneBook -> String wurde auch gegeben), aber ich habe keine Ahnung, wie dies zu implementieren, und ich brauche wirklich Hilfe , weil ich durch Bücher geschaut habe und versuche, mich stundenlang damit zu beschäftigen, wie ich das lösen kann.

Vielen Dank im Voraus

Ps: Ich will verstehen, wie das funktioniert und nicht nur eine Lösung haben, so vielleicht einen Verweis auf das, was als gut wäre hilfreich zu lesen :)

+1

Warum sollte es "Peter" zurückgeben? –

+0

Was ist der Typ und der Zweck von 'enterName'? Es würde scheinen "enterName :: String -> String -> Telefonbuch -> Telefonbuch", aber dann warum sollten Sie erwarten, den neuen "TelephoneBook" -Wert auf eine leere Zeichenfolge anwenden, um '" Peter "' zurück? – chepner

+0

In dem Beispiel, das wir von einer Konsole gegeben hatten, in der sie die oben gezeigte Eingabe eingaben, gab sie den Namen zurück, also implementierte ich sie wie folgt: 'putName :: String -> String -> Telefonbuch -> Telefonbuch' (dies wurde angegeben) ' putName abc = (\ x -> b) '<- mein code – Fapprentice

Antwort

1

Vorausgesetzt, dass Sie sagen, Telephonebook ist ein Typ-Alias ​​String -> String, ich denke, Sie möchten eine Funktion erstellen, die Namen auf Telefonnummer abbildet. Wenn Sie also "Peter" aus dem Buch suchen, gibt es zurück.

Jetzt, wenn Sie nach einem Namen suchen möchten, ist alles Anruf die Abfrage auf dem Telefonbuch. So würde searchFkt wie folgt aussehen:

searchFkt :: String -> Telephonebook -> String 
searchFkt query book = book query 

Dennoch basiert auf Ihre Kommentare, ich glaube, Sie einen Fehler gemacht in Ihrem enterName Programm. Here Sie sagen, Sie implementiert als:

putName :: String -> String -> Telephonebook -> Telephonebook 
putName name number oldbook = \x -> number 

(nahm ich mir die Freiheit a, b und c zu umbenennen.). Wie Sie sehen können, sind name und oldbook auf der rechten Seite des Ausdrucks nicht einmal erwähnt. Infolgedessen vergisst Haskell über diese: es bedeutet also, dass weder name, noch oldbook irgendeine Rolle in der Konstruktion des neuen Buches spielen.

Eine bessere Möglichkeit wäre, es zu implementieren, wie:

putName :: String -> String -> Phonebook -> Phonebook 
putName name number oldbook = newbook 
    where newbook query | query == name = number 
         | otherwise = oldbook query 

Mit anderen Worten: Sie eine neue Funktion newbook konstruieren, die als Eingabe einen query (den Namen, den Sie angeblich lösen). Wenn query gleich dem gegebenen neuen name ist, gibt es das number zurück; andernfalls fragt es die oldbook, um es weiter zu behandeln.

Endlich denke ich, es ist keine gute Idee, das Telefonbuch als eine Funktion String -> String zu implementieren, weil eine nächste Aufgabe sein könnte, eine Reverse-Lookup-Operation zu implementieren, in welchem ​​Fall Sie verloren sind.Es ist besser, es als eine Liste von Tupeln wie [(String,String)] (natürlich hashmaps, usw. wäre ideal) zu implementieren.

+0

Wow, das war schnell :) vielen Dank, ich weiß es nicht HashMaps und Query's noch, also muss ich mal reinschauen! Aber deine Erklärung ergibt Sinn – Fapprentice

2

Dies ist keine Antwort an sich, sondern ein Versuch zu klären, was Ihre Aufgabe zu sein scheint, sowohl für Sie als auch für andere, die versuchen, Ihre Frage (n) zu lesen.


Das ultimative Ziel Ihrer Aufgabe scheint zu sein, ein Telefonbuch mit einer Funktion zu implementieren; Ein fest codiertes Beispiel könnte sein

type TelephoneBook = String -> String 

myPhoneBook :: TelephoneBook 
myPhoneBook "Peter" = "4232" 
myPhoneBook "Alice" = "23213" 

Beachten Sie, dass dies nur eine Teilfunktion ist; Es ist für die überwiegende Mehrheit der möglichen Namen überhaupt nicht definiert.

Ein Problem mit diesem Ansatz ist, dass es kein wirklich leeres Telefonbuch erlaubt, da Sie keine Funktion definieren können, die nicht wirklich irgendetwas tut. So werden wir, dass mit einem „leeren“ Buch ersetzen, die einen Standardwert für einen beliebigen Namen nicht bereits im Telefonbuch zurückgibt:

-- Not ideal, but it's the best we can do given the constraints 
-- imposed by the given type. 
empty :: TelephoneBook 
empty _ = "not found" 

Ihr Ziel ist es, eine Funktion enterName zu schreiben, die einen Namen hat, ein Handy Nummer und ein bestehend Telefonbuch, und gibt ein neues Telefonbuch, das das gleiche wie die alten ist, aber mit einem neuen Eintrag (das jeden vorherigen Eintrag mit dem gleichen Namen überschrieben wird. das heißt,

empty "Peter" == "not found" 
(enterName "Peter" "1234" empty) "Peter" == "1234" 
(enterName "Peter" "1234" empty) "Bob" == "not found" 
(enterName "Bob" "9876" (enterName "Peter" "1234" empty)) "Bob" == "9876" 

Ihre enterName Funktion hat den Typ String -> String -> TelephoneBook -> TelephoneBook, was bedeutet, dass es drei Argumente braucht, und es n mit allen drei etwas zu tun.

enterName :: String -> String -> TelephoneBook -> TelephoneBook 
enterName name number phonebook = ... 

Ebenso Ihre searchFkt :: String -> TelephoneBook -> String Funktion nimmt einen Namen und ein Telefonbuch und gibt die Nummer mit diesem Namen in dem Buch verbunden.

searchFkt :: String -> TelephoneBook -> String 
searchFkt name book = ... 

Angesichts der Definition von TelephoneBook oben und die Beispiele für seine Verwendung, sollte es offensichtlich sein, wie searchFkt zu implementieren.

Verwandte Themen