Как этот код C # делается на функциональных языках (F #? Haskel?) - PullRequest
5 голосов
/ 05 июля 2011

Как я мог написать этот код C # на F # или Haskel, или подобном функциональном языке?

var lines = File.ReadAllLines(@"\\ad1\\Users\aanodide\Desktop\APIUserGuide.txt");

// XSDs are lines 375-471
var slice = lines.Skip(374).Take(471-375+1);

var kvp = new List<KeyValuePair<string, List<string>>>(); 
slice.Aggregate(kvp, (seed, line) => 
{
    if(line.StartsWith("https"))
        kvp.Last().Value.Add(line);
    else
        kvp.Add(
            new KeyValuePair<string,List<string>>(
                line, new List<string>()
            )
        );
    }
    return kvp;
});

1 Ответ

6 голосов
/ 05 июля 2011

Итак, если я правильно прочитал ваш код, ваш ввод будет выглядеть примерно так:

[...]
Foo
https://example1.com
https://example2.com
Bar
https://example3.com
Baz
Xyzzy
https://example4.com
[...]

Отсюда вы хотите, чтобы заголовки были сгруппированы с URL-адресами под ними.Вот программа на Haskell, которая делает это:

import Data.List (isPrefixOf)

groupUrls :: [String] -> [(String, [String])]
groupUrls [] = []
groupUrls (header:others) = (header, urls) : groupUrls remaining
  where (urls, remaining) = span (isPrefixOf "https") others

main = do
    input <- readFile "\\\\ad1\\\\Users\\aanodide\\Desktop\\APIUserGuide.txt"
    let slice = take (471 - 375 + 1) $ drop 374 $ lines input
    let kvp = groupUrls slice
    print kvp

Вывод:

[("Foo",["https://example1.com","https://example2.com"]),("Bar", ["https://example3.com"]),("Baz",[]),("Xyzzy",["https://example4.com"])]

Ключевая интересующая функция здесь span, которая используется здесь длявзять последовательные строки, начинающиеся с "https", и вернуть их вместе с оставшимися строками, которые затем обрабатываются рекурсивно.

...