SML如何在字符列表上获得返回int的时间?

SML如何在字符列表上获得返回int的时间?,sml,Sml,我很难弄清楚,如何将每个处理过的字符恢复为int值 函数的工作方式应该是:val caesar=fn:int*int->int 因此,如果k=2466,n=2,那么输出应该是4688 希望代码不要太奇怪(我是SML新手) 在这里,while循环不是最好的工具。相反,您可以使用map,它为给定列表中的每个项执行给定函数,并返回一个新列表,其中包含每个函数调用的结果 换句话说:map(fnc=>(Char.ord c)+2)[2]、[4]、[6]、[6]将返回[52,54,56,56]。您可以将其转

我很难弄清楚,如何将每个处理过的字符恢复为int值

函数的工作方式应该是:val caesar=fn:int*int->int

因此,如果k=2466,n=2,那么输出应该是4688

希望代码不要太奇怪(我是SML新手)


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

换句话说:
map(fnc=>(Char.ord c)+2)[2]、[4]、[6]、[6]
将返回
[52,54,56,56]
。您可以将其转换回char,并使用
String.infrade
获取字符串“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

Wooh thx:)你能解释一下wrappedAroundInts的值函数吗,我不是100%确定我理解它。另一件事,我需要为fun caesar的一个变体添加一个异常,在这里我检查k是否=8。可以这样做吗?caesar2(k,n:int)=if Option.valOf(int.fromString(String.size(int.toString(k)))!=8然后raise Fail“k必须是8个字符长”@TBK:包装的工作原理如下:
Char.ord
返回一个介于48(ASCII值为
#“0”
)和57(ASCII值为
#“9”
)之间的整数。添加
n
后,该值可能大于57(因此不再表示数字)。为了解决这个问题,我们减去48,然后取模10的结果。现在我们有一个介于0和9之间的数字。通过再加48,我们得到一个介于48和57之间的数字,因此是一个有效数字。@TBK:如果您想检查
k
是否为8,您只需执行
如果k=8,则执行
。如果要检查
k
是否有8位数字,可以执行
If String.size(Int.toString k)=8
。如果要检查
k
是否没有8位数字,可以使用
If String.size(Int.toString k)=8
。无需使用
fromString
,因为
size
返回一个整数。超级感谢:D@TBK:Ehrm,在我最后的评论中,我想说“如果您想检查k是否没有8位数字,可以使用
If String.size(Int.toString k)8
”(
而不是
=
)。不客气。
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