2011-07-04 15 views
5

Làm thế nào tôi có thể viết mã C# này trong F # hoặc Haskel, hoặc một ngôn ngữ chức năng tương tự?Mã C# này được thực hiện bằng các ngôn ngữ chức năng như thế nào (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

Thực ra, đó thực sự là chức năng ... không có (hiển thị) vòng, chỉ cần chức năng ... – digEmAll

+0

Tài liệu MSDN có thông tin về [cách lập trình trong F #] (http://msdn.microsoft.com/en- chúng tôi/library/dd233154.aspx) ... –

+0

@digEmAll: Đó là các đối tượng đột biến. ('.Thêm()') – recursive

Trả lời

6

Vì vậy, nếu tôi đọc mã của bạn một cách chính xác, đầu vào của bạn trông giống như sau:

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

Từ đó, bạn muốn tiêu đề nhóm với các URL bên dưới chúng. Dưới đây là một chương trình Haskell mà thực hiện điều này:

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 

Output:

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

Chức năng quan trọng của lãi suất ở đây là span, được sử dụng ở đây để có những dòng liên tiếp bắt đầu với "https" và trả lại cùng với các dòng còn lại, sau đó được xử lý đệ quy.