Как преобразовать список строк в строку запроса URL в функциональном стиле? - PullRequest
0 голосов
/ 12 февраля 2012

Этот вопрос касается функционального программирования, а не того, как создавать строки URL-запросов. Язык, на котором я работаю - Objective-C, но он также не особенно актуален.

У меня есть исходная структура данных, которая представляет собой массив строк. Каждый нечетный элемент является именем параметра, каждый четный - значением, например, [имя, боб, фамилия, кузнец, пол, мужчина].

Существует ли идиоматический подход FP для преобразования этого списка в строку запроса URL (например, "firstname = bob & lastname = smith & floor = male")?

Я думаю о чем-то вроде «разбиения с использованием предиката mod 2», чтобы дать мне 2 списка ключей и значений соответственно, затем zip с функцией, которая url экранирует ключи и значения и объединяет их с помощью «=». Это даст мне список строк «a = b». Тогда я смогу сделать сгиб влево, чтобы вставить символы '&'.

Думаю, я только что ответил на свой вопрос! Милая! В любом случае, если кто-то, более знакомый с идиомами FP, пожелает прокомментировать.

Спасибо!

Ответы [ 3 ]

1 голос
/ 12 февраля 2012

Вот более-менее прямой перевод вашего английского на C #:

var list = new[]{"firstname", "bob", "lastname", "smith", "gender", "male"};

string.Join("&", 
            list.Where((k, i) => i % 2 == 0)
                .Zip(list.Where((v, i) => i % 2 == 1),
                    (k, v) => k + "=" + v));
1 голос
/ 12 февраля 2012

Это будет более или менее, в Haskell, использующем только стандартные функции прелюдии:

queryStr paramList  =  joinAmp $ map (uncurry joinEq) $ group2 paramList
  where joinEq x y  =  x ++ "=" ++ y

joinAmp  =  foldr1 (\x y -> x ++ "&" ++ y)

group2 []        =  []
group2 (x:y:xs)  =  (x, y) : group2 xs

qStr = queryStr ["firstname", "bob", "lastname", "smith", "gender", "male"]

Проверьте, есть ли в вашей среде функция объединения строк. Например, в Python вы можете сделать "&".join(lst) для функции joinAmp, описанной выше. Я использовал правый сгиб из-за способа, которым Haskell реализует конкатенацию строк.

0 голосов
/ 12 февраля 2012
String o;    
for (i=0; i< -1 + size(strings); i=i+2) {

        if (i==0) {
            o += "?";
        } else {
            o += "&";
        };

        o+= strings[i]+"="+ strings[i+1];

    }
    print o;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...