2011-07-04 13 views
5

Bu C# kodunu F # veya Haskel dilinde veya benzer bir işlevsel dile nasıl yazabilirim? Eğer altlarında URL'ler ile gruplandırılmış başlıkları istiyorum BundanBu C# kodu işlevsel dillerde nasıl yapılır (F #? Haskel?)

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

: Doğru kodunuzu okursanız

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

Aslında bu gerçekten işlevsel gibi ... hayır (görünür) döngüler, sadece işlevler ... – digEmAll

+0

MSDN belgelerinde [nasıl F # programında] hakkında bilgi var (http://msdn.microsoft.com/en- us/library/dd233154.aspx) ... –

+0

@digEmAll: Gerçi nesneleri mutasyona uğratıyor. ('.Add()') – recursive

cevap

6

Yani, sizin girişi şuna benzer. İşte bunu yapan bir Haskell programı:

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 

Çıktı:

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

ilgi anahtar işlevi burada "https" ile başlayan ardışık satırları alıp birlikte dönmelerini burada kullanılan span olduğu kalan çizgiler, daha sonra tekrarlı olarak ele alınır.