我可以使用 F# 中的管道运算符将参数传递给构造函数吗?

2023-12-31

此代码反转字符串:

let reverse (s : string) = new string(s.ToCharArray() |> Array.rev)

是否可以使用管道运算符将所需的参数传递给string()构造函数?例如,这似乎更惯用:

// Doesn't compile:
let reverse (s : string) = s.ToCharArray() |> Array.rev |> new string

同样,为什么我不能使用string运算符通过以下方式?

let reverse2 (s : string) = s.ToCharArray() |> Array.rev |> string

这是在行动中:

> reverse2 "foo" ;;
val it : string = "System.Char[]"

它返回类型而不是“oof”。


不可以,管道运算符只能与 F# 函数一起使用,不能与类构造函数、成员方法或静态方法一起使用。原因是这些类型的方法支持的重载会使 F# 的类型推断变得复杂。但是,如果您确实想使用管道,则可以将 char 数组的每个元素映射到字符串,然后将该序列通过管道传输到Seq.concat "":

s.ToCharArray() |> Array.rev |> Seq.map(string) |> String.concat ""

或者您可以将字符串构造函数调用包装在 F# 方法中:

let stringCArrCtor (carr: char[]) =
    new string(carr)

s.ToCharArray() |> Array.rev |> stringCArrCtor

回答你的最后一个问题,

s.ToCharArray() |> Array.rev |> string

无法使用,因为它相当于

(s.ToCharArray() |> Array.rev).ToString()

并且 Array ToString() 方法没有被重写,因此它只返回默认的反射类型名称。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以使用 F# 中的管道运算符将参数传递给构造函数吗? 的相关文章

  • 如何编写一个计算表达式生成器来累积值并允许标准语言构造?

    我有一个计算表达式生成器 可以随时生成值 并且有许多自定义操作 但是 它不允许标准 F 语言构造 并且我在弄清楚如何添加此支持方面遇到了很多麻烦 举一个独立的例子 下面是一个非常简单且毫无意义的构建 F 列表的计算表达式 type Item
  • F# 和 MEF:导出函数

    因此 我试图在 F 控制台应用程序中运行这个简单的测试 open System Reflection open System ComponentModel Composition open System ComponentModel Com
  • 当 Generic.List.Add 是函数中的最后一个语句并且开启尾调用优化时,性能会受到影响

    我遇到了一个奇怪的性能损失 我将其归结为以下代码
  • F# 静态成员类型约束

    我正在尝试定义一个函数 factorize 它使用类似于 Seq sum 的结构类型约束 需要静态成员 Zero One 和 以便它可以与 int long bigint 等一起使用 似乎无法获得正确的语法 并且无法找到有关该主题的大量资源
  • F# 匹配 ->

    我想做类似的东西 Nemerle 语法 def something match STT 1 with st Summ 2 with st AVG gt st summbycol counter STT 在 F 上 那么 F 是真的吗 没有对
  • 地图中的一组键

    我有一个地图 X 我试图获取一组满足特定条件的键 如下所示 Map Keys X gt Set filter fun x gt 但我找不到从 F 的 Map 集合中获取密钥的方法 转换你的map http msdn microsoft co
  • 基于函数签名的模式匹配

    在 F 中 您可以对函数签名进行模式匹配 我想用一个函数来装饰多个函数 该函数测量函数的执行情况并调用 statsd 我当前的功能是 let WrapFunctionWithPrefix metrics Metric Client IRec
  • 将可区分的联合传递给 InlineData 属性

    我正在尝试对一个解析器进行单元测试 该解析器解析字符串并返回相应的抽象语法树 表示为可区分的联合 我认为使用 Xunit Extensions 属性会非常紧凑InlineData将所有测试用例堆叠在一起
  • 生成尾调用操作码

    出于好奇 我尝试使用 C 生成尾部调用操作码 斐波那契数很简单 所以我的 C 示例如下所示 private static void Main string args Console WriteLine Fib int MaxValue 0
  • 使用反射创建 Action<'T> 的实例

    我将如何创建一个实例Action lt T gt 使用反射 这是我所拥有的 let makeAction typ Type f T gt unit let actionType typedefof
  • F# 方法返回 null 而不是 Option

    我开发F 应用 net 4 6 1 on VS2015 我有方法 type CommonHelper static member SideEffectOnNull act x if x null then act x else x stat
  • 副作用是纯函数中找不到的一切吗?

    可以肯定地说 以下二分法成立 每个给定的函数是 要么纯粹 或有副作用 如果是这样 函数的 副作用就是纯函数中找不到的任何东西 这很大程度上取决于您选择的定义 可以公平地说 函数是pure or impure 纯函数始终返回相同的结果并且不会
  • 是否可以在 F# 类型提供程序中使用 System.Type 作为静态参数?

    我想知道是否可以使用 System Type 作为 F 类型提供程序中的静态参数 以便我可以编写如下内容 type HelperType HelperProvider
  • 我应该强制使用 F# 测量单位的类型吗? [风格与一般性]

    这个问题与 F 相关计量单位 https learn microsoft com en us dotnet fsharp language reference units of measure 我应该为我正在使用的单元强制执行类型吗 例如
  • 我可以提供类型作为 F# 中类型提供程序的输入吗?

    这样做有什么我应该注意的陷阱吗 您知道处理我可能遇到的相同 pb 的现有代码吗 Thks 不幸的是 您无法将类型作为静态参数传递给类型提供程序 使用传递的静态参数MyProvider lt first argument 42 gt 必须是原
  • int -> int list 与类型 int -> IEnumerable<'a> 不兼容

    Given open System Linq 这是一个可以接受的表达方式 2 3 4 SelectMany fun n gt 1 n 但这不是 2 3 4 SelectMany fun n gt 1 n 错误消息显示 int gt int
  • 使用异步工作流程并行化的最佳实践

    假设我想抓取一个网页并提取一些数据 我很可能会写这样的东西 let getAllHyperlinks url string async let req WebRequest Create url let rsp req GetRespons
  • 如何在 F# 中实现返回 void 的接口成员

    想象一下 C 中的以下接口 interface IFoo void Bar 我如何在 F 中实现这一点 我在 30 分钟的在线搜索中找到的所有示例都仅显示具有返回类型的示例 我认为这在函数式风格中更常见 但在这种情况下我无法避免 这是我到目
  • 非泛型类型 Type 不需要类型参数

    我正在创建一个简单的测试类型提供程序 我想提供一个字符串 并返回一个类型名称等于所提供的字符串的类型 但结果不行 说BasicProvider是非泛型类型 Error 非泛型类型 SimpleStringProvider BasicProv
  • Visual Studio 2019 F# NU1101 无法找到包 FSharp.core

    我刚刚开始使用 Microsoft Visual Studio 和 F 我已尽可能地遵循他们的教程 但是当我尝试运行代码时 他们告诉我收到错误 NU1101 Unable to find package FSharp Core No pac

随机推荐