String 如何在F#中迭代字符串?
我有以下F#代码: 我正在尝试将.Net字符串转换为.Net SecureString。当我尝试编译时,会出现类型不匹配错误:String 如何在F#中迭代字符串?,string,f#,String,F#,我有以下F#代码: 我正在尝试将.Net字符串转换为.Net SecureString。当我尝试编译时,会出现类型不匹配错误: stdin(60,10): error FS0001: Type mismatch. Expecting a string -> 'a but given a 'b [] -> unit The type 'string' does not match the type ''a []' 如果我没有指定s的类型,这就是我看到的类型签名: va
stdin(60,10): error FS0001: Type mismatch. Expecting a
string -> 'a
but given a
'b [] -> unit
The type 'string' does not match the type ''a []'
如果我没有指定s的类型,这就是我看到的类型签名:
val toSecureString : char [] -> SecureString
但由于我不想每次都为参数手动创建一个字符数组,所以我似乎遗漏了一些东西。如何使此代码在传入字符串参数的情况下工作
如果有区别的话,我将在F#2.0(Build 4.0.40219.1)上进行测试
欢迎任何提示。如果这个问题已经被问到并回答了,在评论中发布一个链接,我将结束这个问题 使用
Seq.iter
,而不是Array.iter
,因为字符串是char-Seq
s,而不是char[]
s。要将字符串作为char-Seq
进行操作,可以使用。这项工作:
let toSecureString s =
let sString = new SecureString()
String.iter sString.AppendChar s
sString
您也可以这样做:
SecureString(&&s.ToCharArray().[0], s.Length)
谢谢kvb。我知道我遗漏了一些明显的东西。你为什么要使用
SecureString
?如果您已经有一个字符串
,那么将其复制到SecureString
不会增加任何安全性,我认为。这可能就是为什么没有AppendString()
。我使用的是SecureString,因为Windows API需要SecureString。哇,伙计们,三个很好的答案。希望我能选择所有这些作为“接受答案”,我现在有5或6种不同的方法将字符串转换为SecureString。我将做一些评测和一些其他测试,看看是否有什么好的理由选择其中任何一个。博客帖子来了!在返回字符串之前,您不是在处理它吗?谢谢@Daniel——这是第三种方法。我有另一种方法,我没有发布。谢谢@pad,我不知道这个选项。实际上,我更喜欢使用字符串模块而不是Seq模块来避免类型注释:)。对不起@pad——什么类型的注释?如果我使用Seq.iter,我不需要上面代码中的s或cl的类型规范。我的意思是避免明确地说s
是string
,而不是Seq
。您不必使用lambda,您可以直接传递sString.AppendChar
。当然,如果您使用Seq.iter
并删除类型注释,那么该函数将处理任何字符序列,而不仅仅是字符串。
SecureString(&&s.ToCharArray().[0], s.Length)