我正在Standrd ML 中为课堂作业编写凯撒密码。我对函数式编程非常熟悉,知道地图可能是我想要的。我无法理解在标准 ML 中实现地图功能的方式。
fun chrEnc (letter:char, key:int): char =
if Char.isAlpha(letter) then
if Char.isUpper(letter) then
chr (ord #"A" + (ord letter - ord #"A" - key) mod 26)
else chr (ord #"a" + (ord letter - ord #"z" - key) mod 26)
else letter;
fun chrDec(letter:char, key:int): char =
chrEnc(letter, (~1 * key));
fun msgEnc(message:string, key:int): string =
implode (map (fn x => chrEnc(x,key)) (explode message));
您可能会猜到 msgEnc 的预期行为是获取消息和键,并遍历消息,执行 chrEnc(x key) 其中 x 是字符串消息中的当前值并返回映射的字符串。msgEnc("IBM",1); 的预期输出 应该是“HAL”。但是,它是“HBM”,这使它看起来好像只对第一个字符进行操作。我想也许使用 (explode message) 作为 map 的列表参数可能是问题,所以我尝试了:
fun msgEnc(message:string, key:int): string =
val msg = explode message;
implode (map (fn x => chrEnc(x,key)) msg);
但是 val 上的 REPL barfs 说:
= = = = = [自动加载]
[库 $SMLNJ-BASIS/basis.cm 稳定]
[自动加载完成]
val chrEnc = fn : char * int -> char
- - = val chrDec = fn : char * int -> char
- - = stdIn:27.2 错误:在 VAL 处发现语法错误
不知道我错过了什么,我的假设是我误解了 map 的语法或用法。昨天之前我从未见过 ML,所以我是个傻子。