2012-02-27 14 views
4

私は、次のF#コードを持っている:F#で文字列を反復するには?

//Array iter version 
let toSecureString (s:string) = 
    let sString = new SecureString() 
    s |> Array.iter (fun cl -> sString.AppendChar cl) 
    sString 

私はネットSecureStringには、.NET文字列を変換しようとしています。私は型の不一致エラーを取得するコンパイルしようとすると:「

val toSecureString : char [] -> 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の種類を指定しない場合、これは私が見るタイプの署名であります毎回引数の文字列を手作業で作成しなければならないと思っています。何か不足しているようです。どのように文字列パラメータを渡してこのコードを動作させることができますか?

私はF#2.0(ビルド4.0.40219.1)でテストしています。

ヒントを歓迎します。これがすでに尋ねられ、回答されている場合は、コメントにリンクを投稿してください。この質問を終了します。

+0

?すでに 'string'を持っていれば、' SecureString'にコピーしてもセキュリティは追加されません。これはおそらく 'AppendString()'が存在しない理由です。 – svick

+0

Windows APIにSecureStringが必要なので、私はSecureStringを使用しています。 –

+0

うわー、みんな、3つの優れた答え。私が "受け入れられた答え"としてすべてを選択できることを願っています –

答えて

12

Seq.iterを使用してください。Array.iterではなく、char seqsですが、char[]ではなくです。

+0

ありがとうございました。私は何かが明らかでないことを知っていた。 –

5

文字列をchar seqとして操作するには、String moduleを使用できます。これは動作します:

let toSecureString s = 
    let sString = new SecureString() 
    String.iter sString.AppendChar s 
    sString 
+0

ありがとう@pad私はそのオプションを知らなかった。 –

+0

実際には、タイプ注釈を避けるためにSeqモジュールにStringモジュールを使用することをお勧めします。 – pad

+0

申し訳ありません@ pad - どのようなタイプの注釈ですか? Seq.iterを使用する場合は、上記のコードでsまたはclの型指定は必要ありません。 –

3

あなたもこれを行うことができます:なぜあなたはまったく `SecureString`を使用している

SecureString(&&s.ToCharArray().[0], s.Length) 
+0

ありがとう@ダニエル - これに第3のアプローチ。私は投稿しなかった別のアプローチがあります。 –

関連する問題