如何将字符串列表转换为功能样式的URL查询字符串?

时间:2012-02-12 13:16:37

标签: functional-programming

这个问题是关于函数式编程,而不是关于如何构建URL查询字符串。我正在使用的语言是Objective-C,但这也不是特别相关。

我有一个起始数据结构,它是一个字符串数组。每个奇数元素都是参数名称,每个偶数都是值,例如[firstname,bob,lastname,smith,gender,male]。

是否有一种惯用的FP方法将此列表转换为URL查询字符串(例如“firstname = bob& lastname = smith& gender = male”)?

我正在考虑使用“使用mod 2谓词进行分区”的行,分别给出2个键和值列表,然后使用url转义键和值的函数zip并使用'='连接它们。这将给我一个'a = b'字符串的列表。然后我应该可以做一个折叠左边插入'&'符号。

我想我可能刚刚回答了我自己的问题!甜!无论如何,如果有人更熟悉FP习语,想要发表评论。

谢谢!

3 个答案:

答案 0 :(得分:1)

这或多或少都是在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实现字符串连接的方式,我使用了右折叠。

答案 1 :(得分:1)

这里或多或少是将您的英语直接翻译成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));

答案 2 :(得分:-1)

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;