2

文字を受け取る関数 foo があります。その関数を文字列内の各文字にマップしたいと思います。

fun foo (ch : char) =
    ch;
fun bar (str : string) =
    map foo [(str)];

char を期待する関数に文字列が適用されているため、明らかにこれは機能しません。そのため、 String.explode(str) を使用して char 配列に分割しようとしましたが、配列内の各 char をマップして foo 関数に char を適用することができないようです。

fun foo (ch : char) =
     ch;
fun bar (str : string) =
    map foo [(String.explode(str))];

文字列内の各文字に関数をマップするにはどうすればよいですか?

編集: foo を変更して 2 つのパラメーターを取るようにしたかった

fun foo(ch : char, i : int) =
    ch;
fun bar(str : string) =
    map foo (String.explode(str), 1);

しかし、それは私に大物のミスマッチを与えます

operator domain: (char * int) list
operand:         char list * int

以前は String.explode(str) が map 関数によって各 char にマップされると理解されていたのに、今では完全な char リストとして認識されているのはなぜですか?

編集2:気にしないで、それを理解しました。

fun bar(str : string) =
    map (fn x => foo (x, 1)) (String.explode(str));
4

2 に答える 2

2

map各文字を処理したい場合map、指定するリストは文字のリストでなければなりません。explode文字のリストを返すので、使用するexplodeのは間違いなく正しい考えです。しかし、返されたリストexplodeを別のリストに入れているため、文字のリストのリストになります。そのため、型エラーが発生します。

外側のリストを削除するだけで、コードは意図したとおりに機能します。

于 2013-04-21T15:33:55.153 に答える
0
- String.map Char.succ "HAL";
> val it = "IBM" : string
于 2016-03-01T18:49:20.130 に答える