2017-01-17 8 views
-2

Он, ребята,Haskell Phonebook добавление элементов

Моя задача - запрограммировать телефонную книгу в Haskell. Поэтому указывается телефонная книга. Телефонная книга отображает имена (String) на их номера телефонов (String). Но теперь у меня есть проблемы, реализующие функцию «вставить»:

Heres код:

type Phonebook = String -> String 

emptyPhonebook :: Phonebook 
emptyPhonebook = \_->"" 

insert :: String -> String -> Phonebook -> Phonebook 
insert name number emptyPhonebook = (\name->number)  --is this correct? 
insert name number existingPhonebook = ?? 

Мой вопрос: Как вставить функцию в функцию? Я имею в виду, теперь мне нужно вставить запись, состоящую из функции (имя -> номер) в другой функции (существующая телефонная книга), или я ошибаюсь? Спасибо за помощь мне :)

+0

Это точный вопрос был задан вчера уже. В любом случае, не представляйте его, используя функции; что кажется ужасно запутанным. Используйте карту (структуру, а не функцию). – Carcigenicate

+0

Итак, вы имеете в виду разрешить это со списками. То есть, конечно, путь проще, но я должен решить его так же :( –

+0

Не списки, карта/словарь. Они связывают один вход с другим, вот что вы пытаетесь сделать здесь: связать имя с номером. – Carcigenicate

ответ

3

Что-то, как это должно работать:

type Phonebook = String -> String 

emptyPhonebook :: Phonebook 
emptyPhonebook _ = "" 

insert :: String -> String -> Phonebook -> Phonebook 
insert name number phonebook = 
     case phonebook name of 
      "" -> (\s -> if s == name then number else phonebook s) 
      _ -> phonebook 
+0

Ahh, просто цепляя функции. Я сделал это в JS, не могу поверить, что я не думал об этом здесь. – Carcigenicate

+0

Спасибо, Михаил, но я не понимаю переменную s. Вы не инициализировали его так, как вы можете сравнить его с именем строки? –

+0

@JohnDoe 's' будет аргументом получаемой функции, поэтому, когда вы вызываете' nonEmptyPhonebook 'John' ', он будет заменен на« John ». – Michail