此代码反转字符串:
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(使用前将#替换为@)