2015-09-27 5 views
-3

Я немного смущен тем, как вернуть список чего-то в тип данных. Я полагаю, что мне нужно использовать функцию карты, но я не уверен, как ее использовать в этом контексте. Например, если у меня есть тип данных ниже (странно, я знаю, но это конкретно), как бы я написать функциюHaskell Как использовать карту, чтобы вернуть список?

makeList :: Car -> [Make] 
makeList map f ??? 

, которая возвращает список марок всех автомобилей на входе (как показано ниже) , и пустой список [], если задано «makeList Tail».

data Car = Model Make Car | Tail 

> makeList (Car Audi (Car Porsche Tail)) 
    [Audi,Porsche] 
> makeList Tail 
    [ ] 
+4

Это, по крайней мере, второй вопрос, который я видел недавно с тегом [tag: dictionary], но не имеющим ничего общего со словарями. Мне любопытно, если у вас есть представление о том, почему это может произойти. – dfeuer

+1

Пожалуйста, не редактируйте свой вопрос, чтобы удалить важную информацию, например, определение «Автомобиль». Я вернул ваше редактирование. –

ответ

5

Тип Car это эквивалент (математики бы использовать термин изоморфными) к спискам в Haskell специализируется на тип Make данных. списки Haskell определяются как

data [a] = a : [a] | [] 

Где : и [] являются конструкторами. Если мы дадим им машиночитаемые имена больше человеческих это может сделать больше смысла

data List a = Cons a (List a) | Empty 

Все, что я сделал это заменитель [a] для List a, : для Cons и [] для Empty. Если мы специализируемся это к определенному типу, такие как Int, мы бы

data List = Cons Int List | Empty 

Теперь мы видим корреляции между списками Haskell и вашего Car типа, это просто, что Car = List, Model = Cons и Tail = Empty.

Вашего makeList функции фактически просто преобразование списка в Car стиле в список в [] стиле, map не надо (и не будет полезным, так как он работает только на [] списках стилей). Вместо этого вам просто нужно делать правильные замены

makeList :: Car -> [Make] 
makeList Tail = [] 
makeList (Car make nextCar) = ... 

Я не хочу, чтобы дать все прочь, так как это звучит как домашнее задание, но в этот момент вам просто нужно сделать второе предложение makeList рекурсивно построить обычный список []. Опять же, большие подсказки «рекурсивно» и «[] список стилей».

Смежные вопросы