F# 将字符列表(或数组)转换为字符串

F# 将字符列表(或数组)转换为字符串,f#,F#,如何将字符列表转换为字符串 换言之,如何反转q“abcd”的列表 更新:new System.String(List.ofSeq“abcd”|>List.toArray)|>printfn“%A”似乎可以正常工作,无论是否使用new,但是List.ofSeq“abcd”|>List.toArray)|>新系统.String |>printfn“%A”失败。为什么?您的方法: new System.String (listOfChars |> List.toArray) 这也是我通常的解决

如何将字符列表转换为字符串

换言之,如何反转q“abcd”的列表

更新:
new System.String(List.ofSeq“abcd”|>List.toArray)|>printfn“%A”
似乎可以正常工作,无论是否使用
new
,但是
List.ofSeq“abcd”|>List.toArray)|>新系统.String |>printfn“%A”
失败。为什么?

您的方法:

new System.String (listOfChars |> List.toArray)
这也是我通常的解决方案


F#的语法/类型推断系统似乎根本无法将.NET构造函数(如
new String
)识别为curried函数(这会阻止您使用管道)。

我以前问过一次。似乎对象构造函数是不可组合的,所以不能将它们作为函数传递

List.ofSeq "abcd" |> List.toArray |> (fun s -> System.String s) |> printfn "%A"
List.ofSeq "abcd" |> List.toArray |> (fun s -> new System.String(s)) |> printfn "%A"
更新 构造函数是F#4.0中的一级函数

在F#中使用字符串有时有点不舒服。我可能会使用与Dario相同的代码。F#语法不允许将构造函数用作第一类函数,因此很遗憾,您无法在单个管道中完成整个处理。通常,可以使用静态成员和实例方法作为第一类函数,但不能使用实例属性或构造函数

无论如何,有一个非常讨厌的技巧可以用来将构造函数转换为函数值。我不建议实际使用它,但我很惊讶地看到它确实有效,所以我认为它可能值得分享:

let inline ctor< ^R, ^T 
  when ^R : (static member ``.ctor`` : ^T -> ^R)> (arg:^T) =
   (^R : (static member ``.ctor`` : ^T -> ^R) arg)
您还可以使用
ctor
的结果作为一级函数:

let chars = [ 'a'; 'b'; 'c' ]
let str = chars |> Array.ofSeq |> ctor<System.String, _>
let chars=['a';'b';'c']
设str=chars |>Array.ofSeq |>ctor

正如我所说,我认为这主要是一种好奇心,但也是一种相当有趣的好奇心:-)

刚刚遇到了类似的问题,并提出了以下解决方案:

List.fold (fun str x -> str + x.ToString()) "" (List.ofSeq "abcd") 

好的,这个限制在性能方面是有意义的(创建一个可能很难优化的lambda可能会以一种难以检测的方式损害性能)。任何关于为什么“新”是可选的指针?要使通过反射创建对象与Ocaml/F#语法更好地融合?谢谢很难选择一个答案,我会选择这个,因为它引用了另一个相关的问题。:-)“看来对象构造函数是不可组合的,所以不能将它们作为函数传递。”这终于改变了。我在尝试第三个代码段时遇到一个编译器错误,它说“类型名和/或对象构造函数的使用无效…”@reggaeguitar该错误表示您正在运行较旧版本的F。您需要更新到VS 2015附带的F#4.0。
let chars = [ 'a'; 'b'; 'c' ]
let str = chars |> Array.ofSeq |> ctor<System.String, _>
List.fold (fun str x -> str + x.ToString()) "" (List.ofSeq "abcd")