2011-07-04 14 views
5

Jak mogę napisać ten kod C# w języku F # lub Haskel, lub podobny język funkcjonalny?Jak działa ten kod C# w językach funkcjonalnych (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; 
}); 
+0

To naprawdę funkcjonalne ... nie (widoczne) pętle, tylko funkcje ... – digEmAll

+0

Dokumenty MSDN zawierają informacje na temat [jak programować w języku F #] (http://msdn.microsoft.com/en- us/library/dd233154.aspx) ... –

+0

@digEmAll: Ale mutuje obiekty. ('.Add()') – recursive

Odpowiedz

6

Tak więc, jeśli czytam poprawnie kod, Twój wkład wygląda mniej więcej tak:

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

od tego, chcesz nagłówki sekcji z adresów URL pod nimi. Oto program Haskell, że robi to:

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 

wyjściowa:

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

Kluczową funkcją zainteresowania tutaj jest span, który jest używany tutaj, aby podjąć kolejne linie zaczynające "https" i zwraca je wraz z pozostałe linie, które są następnie rekursywnie traktowane.