SML如何在字符列表上获得返回int的时间?
我很难弄清楚,如何将每个处理过的字符恢复为int值 函数的工作方式应该是:val caesar=fn:int*int->int 因此,如果k=2466,n=2,那么输出应该是4688 希望代码不要太奇怪(我是SML新手)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]。您可以将其转
在这里,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