2010-01-26 42 views
62

chức năng bản đồ trong Haskell có hai tham số đầu vào. Tham số đầu tiên là một hàm và tham số thứ hai là một danh sách. Hàm map áp dụng hàm được truyền như tham số đầu vào cho tất cả các phần tử trong danh sách và trả về một danh sách mới.C# tương đương với chức năng bản đồ trong Haskell

Có C# tương đương với chức năng này không?

+1

Bạn có thể muốn xem F #. Nó thu hẹp khoảng cách giữa C# và Haskell. – ChaosPandion

+2

Không thực sự. Nó giống như "OCaml for .NET". – jrockway

+2

Chưa kể rằng tất cả các ngôn ngữ ML-family (bao gồm F # và Haskell) được cho là có nhiều điểm chung hơn với bất kỳ ngôn ngữ C-family nào; bất cứ ai có thể xử lý F # cũng có thể xử lý Haskell hoặc OCaml. –

Trả lời

74

Select

MSDN Reference

Xem câu hỏi của tôi here (Chỉ khi bạn tò mò vì nó không liên quan trực tiếp).

+8

Cảm ơn ... Đây là một bộ đếm bit trực quan, tôi đã nghĩ Select sẽ lọc các hàng từ một bộ sưu tập. –

+7

Tôi thực sự hy vọng bạn kiểm tra câu hỏi của tôi. – ChaosPandion

+1

BM: Lọc đến từ đâu. –

10

Và để trả lời câu hỏi bạn không hỏi, tương đương Haskell ràng buộc đơn nguyên "chuỗi" được gọi là SelectMany trong C#. Xem bài viết tuyệt vời Wes Dyer của về vấn đề này để biết chi tiết:

http://blogs.msdn.com/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx

+1

Cập nhật liên kết - https://blogs.msdn.microsoft.com/wesdyer/2008/01/10/the-marvels-of-monads/ –

13

Kể từ SelectSelectMany đã được đề cập, tôi sẽ trả lời một câu hỏi bổ sung mà bạn không đặt câu hỏi: fold được tìm thấy như Aggregate.

Bây giờ mọi người đọc bài này nên được trang bị đầy đủ để trở thành Người đàn ông viết Ngôn ngữ X sử dụng thành ngữ Ngôn ngữ Y ... để các đồng nghiệp lập trình C# của bạn không nhận được quá.

+4

Bây giờ camccann, không có gì sai khi ném một cờ lê chức năng vào hộp công cụ của bạn mặc dù bạn buộc phải đóng đinh. Bạn có thể phải thắt chặt một vài bu lông. – ChaosPandion

+4

@camccan Chức năng C# thực sự khá tốt. Chỉ vì ngôn ngữ không đúng chức năng không có nghĩa là hầu hết các lập trình viên .net sẽ không được hưởng lợi nhiều từ việc xây dựng mọi thứ * nhiều hơn * chức năng hơn. –

+3

Sử dụng các tính năng lập trình chức năng mà C# cung cấp là một ý tưởng tuyệt vời.Buộc C# thành các thành phần chức năng mà nó không hỗ trợ tốt (ví dụ, ứng dụng curried một phần là rất phổ biến trong Haskell), có thể sẽ khiến bạn đau đầu, làm xáo trộn mã của bạn và làm phiền bất cứ ai khác phải làm việc với nó. –

17

Một giải pháp thay thế khác cho SelectSelectMany là viết phương thức mở rộng của riêng bạn.

public static IEnumerable<U> Map<T, U>(this IEnumerable<T> s, Func<T, U> f) 
{ 
    foreach (var item in s) 
    yield return f(item); 
} 

Cảm ơn Wes Dyer vì phương pháp mở rộng ngọt ngào này! :) Xem post để biết thêm chi tiết.

3

Làm thế nào về ConvertAll? Dường như gần nhất với Bản đồ.

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