SML如何在char列表中获取返回int?

时间:2010-09-15 13:06:01

标签: sml

我有点难以弄清楚如何将每个已处理的字符恢复为int值。

该函数应该像:val caesar = fn:int * int - > INT

因此,如果k = 2466且n = 2,则输出应为4688

希望代码不是太奇怪(我是一个SML新手)。

 (* Load Libs *)
    load "Int";
    load "Real";
    load "String";
    load "Char";
    load "List";


    fun caesar (k, n) =
      let
        fun k_string (i) = Int.toString(i)
        fun item_k_char (x, y) = Char.ord (List.nth (x, y))

        val val_k_string = k_string(k)
        val k_explode = String.explode(val_k_string)
        val counter = ref 0
        val counter_end = (String.size(val_k_string) - 1)

      in 
        while (!counter >= counter_end) do (
          item_k_char(k_explode, !counter) + n;
          counter := !counter + 1
        )
      end;

1 个答案:

答案 0 :(得分:2)

while循环不是这里最好的工具。相反,您可以使用map为给定列表中的每个项执行给定函数,并返回一个新列表,其中包含对函数的每次调用的结果。

换句话说:map (fn c => (Char.ord c) + 2) [#"2", #"4", #"6", #"6"]将返回[52,54,56,56]。您可以将其转换回char并使用String.implode来获取字符串“4688”。

您可能还想添加一些逻辑,以便数字“环绕”,即caesar (7,7)变为4

所以你的所有代码都变成了:

fun caesar (k, n) =
  let
    val val_k_string = Int.toString k
    val k_explode = String.explode val_k_string
    val ints = map (fn c => (Char.ord c) + n) k_explode
    val wrappedAroundInts = map (fn i => (i - 48) mod 10 + 48) ints
    val chars = map Char.chr wrappedAroundInts
    val string = String.implode chars
  in
    Option.valOf (Int.fromString string)
  end