2011-07-04 8 views
5

¿Cómo podría escribir este código C# en F # o Haskel, o un lenguaje funcional similar?¿Cómo se hace este código C# en los idiomas funcionales (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

En realidad eso es realmente funcional, como ... no hay bucles (visibles), solo funciones ... – digEmAll

+0

Los documentos de MSDN tienen información sobre [cómo programar en F #] (http://msdn.microsoft.com/en- us/library/dd233154.aspx) ... –

+0

@digEmAll: Sin embargo, es mutar objetos. ('.Add()') – recursive

Respuesta

6

Por lo tanto, si he leído el código correctamente, su entrada es como la siguiente:

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

partir de esto, desea que los encabezados agrupadas con las direcciones URL por debajo de ellos. He aquí un programa Haskell que hace esto:

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 

Salida:

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

La función clave de interés aquí es span, que se utiliza aquí para tomar las líneas consecutivas que comienzan con "https" y devolverlos junto con las líneas restantes, que luego se tratan recursivamente.

Cuestiones relacionadas