2014-10-17 16 views
5

Tôi đang chuyển chức năng Haskell's/LiveScript each thành C# và tôi đang gặp một số vấn đề. Chữ ký của hàm này là (a → Undefined) → [a] → [a] và tôi làm việc rất tốt với các biểu thức gõ và lambda trong Haskell hoặc LS, nhưng C# làm cho tôi bối rối. Việc sử dụng cuối cùng của phương pháp mở rộng này sẽ là:Trộn các phương thức mở rộng, các generic và các biểu thức lambda

String[] str = { "Haskell", "Scheme", "Perl", "Clojure", "LiveScript", "Erlang" }; 
str.Each((x) => Console.WriteLine(x)); 

Và, với điều này, đầu ra của tôi nên là:

Haskell 
Scheme 
Perl 
Clojure 
LiveScript 
Erlang 

thực hiện sở hữu hiện có của tôi về each là:

public static void Each<T>(this IEnumberable<T> list, Action closure) 
{ 
    foreach (var result in list) 
    { 
    Delegate d = closure; 
    object[] parameters = { result }; 
    d.DynamicInvoke(parameters); 
    } 
} 

Các vấn đề là ở đây tôi chỉ không thể vượt qua một tham số trong biểu thức lambda của tôi. Tôi không thể làm (x) => ....

Làm cách nào để chuyển các tham số sang biểu thức lambda? Nó rất dễ làm việc với các hàm hạng nhất trong Haskell hơn là trong C#. Tôi chỉ rất bối rối.

Đối với những người không biết thực hiện Each, nó được sử dụng cho các hiệu ứng phụ, trả về danh sách riêng và áp dụng một đóng lặp và chuyển mỗi giá trị của danh sách làm đối số. Việc triển khai trong PHP phải là:

public static function each($func) { 
    // where $this->value is a list 
    foreach ($this->value as $xs) { 
    $func($xs); 
    } 
    return $this->value; 
    // Or return $this; in case of method-chaining 
} 

Ai đó có thể giúp tôi? Tôi đã tìm kiếm nó nhưng nó không rõ ràng đối với tôi. [Và tôi không muốn sử dụng LINQ]

+2

"Tôi không muốn sử dụng LINQ". Tại sao? Bạn đang phát minh lại bánh xe. –

+1

Haskell không có hàm 'each' - ví dụ sẽ sử dụng' forM_': 'forM_ str putStrLn' – Lee

+1

' List 'cũng có phương thức' .foreach() 'trong đó bạn có thể sử dụng đại biểu chuỗi cũng – MethodMan

Trả lời

10

Bạn cần một Action<T> thay vì Action. Bạn cũng có thể gọi trực tiếp thay vì sử dụng DynamicInvoke:

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