2011-07-04 37 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.

Các vấn đề liên quan