2015-04-08 2 views
1

пример оригинального (41.12, [1,2,3,0])Haskell список список символов, добавив к кортежу

name = ["pete","ben","bill","bob"] 

пример вывода (41.12, [1,2,3,0], ["ben","bill","bob","pete"])

код до сих пор:

getnames :: (Double, [Int]) -> (Double, [Int] -> [[Char]]) 
getnames (nil , []) = error "List is empty" 
getnames xs = [(doublevalue , listofints, listofstrings)) | x <- xs] 

Как я использовать список Int, чтобы получить значение из списка имен и поместите его в кортеж (я знаю, когда я добавляю это в тюль, это уже не кортеж)

Какой метод я использовал бы для этого?

+3

Что вы пробовали? Есть идеи? Вы знаете функцию/оператор, которая дает вам элемент вашего списка на основе индекса? Если вы не можете написать его? – Carsten

+1

Теперь ваша подпись типа говорит: «Возьмите упорядоченную пару, содержащую double и список ints, и верните упорядоченную пару, содержащую double и функцию из списка int, в список строк». Что вы пытаетесь сделать здесь точно? –

+0

Если вы пытаетесь сделать кортеж с переменным размером, это невозможно. –

ответ

3

Оператор (!!) может быть использован для индексирования списка. Учитывая пару, вы можете использовать что-то вдоль линий:

getnames :: (Double, [Int]) -> [String] -> (Double, [Int], [String]) 
getnames (dbl, ixes) names = 
    let namesLst = map (names !!) ixes in 
    (dbl, ixes, namesLst) 

Live demo

Чтобы получить то, что вы хотите, я фиксированной свою подпись, чтобы иметь возможность передавать имена и фиксированный возврат (который возвращал тройку с функцией в конце). Также обратите внимание, что [Char] и String - это точно такой же тип.

Таким образом, внутри тела функции у вас есть dbl, который является вашим двойным и напрямую перенаправляется в окончательную тройку. Затем у вас есть ixes, которые являются индексами элементов, которые вы должны взять с ixes.

В этот момент мы вычисляем namesLst путем сопоставления функции индекса по индексам, чтобы получить имена в правильном порядке. Как только у нас есть этот список, нам просто нужно поместить его в третий элемент тройки.

Если вы хотите, чтобы провалиться по пустому списку индекса (даже если список имен пуст), то вы можете добавить:

getnames (_, []) _ = error "..." 

где _ означает «я не забочусь достаточно, чтобы назвать этот аргумент» , И можно рассматривать как заполнитель для аргумента, который вы не будете использовать.

+0

nice - +1 для живой демонстрации - никогда не видел этого раньше - спасибо за демонстрацию: D – Carsten

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