【问题标题】:What is the C# equivalent of map function in HaskellHaskell中map函数的C#等价物是什么
【发布时间】:2010-01-26 21:54:17
【问题描述】:

Haskell 中的map 函数有两个输入参数。第一个参数是一个函数,第二个参数是一个列表。 map 函数将作为输入参数传递的函数应用于列表中的所有元素并返回一个新列表。

是否有与此功能等效的 C#?

【问题讨论】:

  • 您可能想查看 F#。它弥合了 C# 和 Haskell 之间的差距。
  • 并非如此。它更像是“用于 .NET 的 OCaml”。
  • 更不用说所有 ML 家族语言(包括 F# 和 Haskell)彼此之间的共同点比任何 C 家族语言都多;任何会处理 F# 的人都可能会处理 Haskell 或 OCaml。
  • @jrockway, @camccann:我不是在谈论语言的语法。我的意思是 F# 不会强迫你总是使用纯函数式风格。

标签: c#


【解决方案1】:

Select

MSDN Reference

请参阅我的问题Why is the LINQ "apply-to-all" method named Select?(仅当您好奇时,因为它没有直接关系)。

【讨论】:

  • 谢谢...这有点违反直觉,我在想 Select 会过滤集合中的行。
  • 我真的希望你看看我的问题。
  • BM:过滤来自哪里。
【解决方案2】:

SelectSelectMany 的另一种替代方法是编写自己的扩展方法。

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

感谢 Wes Dyer 提供的这种甜蜜的扩展方法! :) 详情请见post

【讨论】:

    【解决方案3】:

    既然已经提到了SelectSelectMany,我将回答一个你没有问的附加问题:fold 被发现为Aggregate

    现在阅读这篇文章的每个人都应该完全有能力成为那个使用语言 Y 习语编写语言 X 的人......所以为了你的 C# 程序员同胞,不要携带离开。

    【讨论】:

    • 现在 camccann,即使您必须敲钉子,将功能扳手扔进工具箱也没有错。您可能需要拧紧几个螺栓。
    • @camccan 函数式 C# 真的很不错。仅仅因为该语言不是严格的函数式,并不意味着大多数 .net 程序员不会从构建更多函数很多的东西中受益匪浅。
    • 使用 C# 提供的函数式编程特性是个好主意。另一方面,强制 C# 使用它不能很好支持的函数式惯用语(例如,在 Haskell 中非常流行的柯里化部分应用程序)可能会让您头疼,混淆您的代码,并惹恼其他必须工作的人用它。
    【解决方案4】:

    ConvertAll 怎么样?它看起来像最近的地图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-30
      • 2012-02-26
      • 2011-06-12
      • 2014-02-06
      • 2017-08-04
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      相关资源
      最近更新 更多