将Java转换为标准ML(SML)
我的几个朋友正在SML中开发一个简单的递归函数,但由于缺乏SML及其语法的文档,到目前为止还未能创建它。为了帮助他们,我试着自己找点东西,但到目前为止都没有成功 这是我用Java编写的函数。它可以工作,我想把这个函数的概念转换成SML将Java转换为标准ML(SML),java,encryption,recursion,cryptography,sml,Java,Encryption,Recursion,Cryptography,Sml,我的几个朋友正在SML中开发一个简单的递归函数,但由于缺乏SML及其语法的文档,到目前为止还未能创建它。为了帮助他们,我试着自己找点东西,但到目前为止都没有成功 这是我用Java编写的函数。它可以工作,我想把这个函数的概念转换成SML private static int shift; private static boolean firstRun = true; private static void crackThatThing(int clearText, int cryptoTe
private static int shift;
private static boolean firstRun = true;
private static void crackThatThing(int clearText, int cryptoText) {
if (firstRun) { // Make sure that the shift is only set once
firstRun = false;
shift = ((cryptoText % 10) - (clearText % 10)) % 10;
crackThatThing((clearText / 10), (cryptoText / 10));
} else {
if (clearText > 0 && cryptoText > 0) {
if (shift != ((cryptoText % 10) - (clearText % 10)) % 10) {
// The shift value changed - this is not a valid encryption!
System.out.println("This is not a valid encryption!");
} else {
// If the shift value is the same as before, continue with the next number
crackThatThing((clearText / 10), (cryptoText / 10));
}
} else {
// The encryption is valid
System.out.println("The encryption is valid. The shift is: " + shift);
}
}
}
有什么想法吗
编辑:我认为应该是这样的
下面的代码完全是基于以前没有任何使用SML的经验,因为我实际上删除了我编写的代码,这是基于我能记住的位。我知道这是错误的,很可能是可怕的代码,但请在这一点上容忍我
var notValid = "This is not a valid encryption!";
var valid = "The encryption is valid. The shift is: ";
var shift = 11; (* This is just to initialize it *)
var firstRun = true;
fun crackThatThing(clearText, cryptoText) =
if firstRun = true then
firstRun = false andalso
shift = ((cryptoText mod 10) - (clearText mod 10) mod 10) andalso
crackThatThing(clearText div 10, cryptoText div 10)
else
if clearText > 0 andalso cryptoText > 0 then
if not (shift = ((cryptoText mod 10) - (clearText mod 10) mod 10)) then
notValid
else
crackThatThing(clearText div 10, cryptoText div 10)
else
valid;
网上有大量的书籍和资源(见下文) 您需要函数
div
和mod
以及一些通用函数原理,例如递归来解决这个问题。
我不会给你任何代码,因为这是一个每周的作业。不过,我非常乐意在与本任务无关的更具体问题上提供帮助
链接
- 丹麦文:(我找不到最新版本的链接)
我看到的所有例子都只涉及非常简单的if-else语句 那我敢说你看起来不太好!请参阅上面的链接列表,其中至少有几个包含不同级别的SML介绍 与其他语言相比,SML的文档是荒谬的 您并不是真正指的是您正在谈论的文档,但我只能猜测它不是定义/注释。不管怎样,你似乎不知道自己在说什么 我的朋友们已经能够使用两个函数而不是一个函数将其“转换”为SML,但在它应该非常简单的时候这样做似乎很愚蠢
事实上,一旦你理解了功能原理,它实际上是非常简单的。同样,我很乐意就具体问题给出一些建议。从代码中,我看到的主要内容是,您正在尝试分配变量(您编写了类似于
firstRun=false
,但=
实际上是相等运算符)。ML中的变量不能赋值(所以“变量”是一个用词不当的词;它们实际上在某种意义上是常量)。您可以重新编写代码以不使用变异,也可以使用显式可变单元(称为“引用”)。对于可变单元格,基本上可以使用ref
函数创建具有给定初始值的可变单元格。您可以使用
运算符获取单元格的值;然后使用:=
操作符更改单元格内的值
然而,我认为在您的情况下使用可变全局状态是一个坏主意。这是一种糟糕的风格,它似乎会使你的功能无法使用一次以上。在我看来,在递归调用函数时,可以使用全局变量跟踪信息。相反,您可以定义一个内部函数(从局部到外部函数)来执行递归,这样您就可以跟踪外部函数的局部变量中的内容和/或在递归内部函数时传递其他变量,而无需将状态公开到全局范围
另外,您不使用
var
声明变量;你可能想要val
就像我说的,这不是我的任务。我看到的所有示例都只涉及非常简单的if-else语句,与其他语言相比,SML的文档是荒谬的。我的朋友们已经能够使用两个函数而不是一个函数将其“转换”为SML,但在它应该非常简单的时候这样做似乎很愚蠢。“就像我说的,这不是我的作业。”更新的越少,这是一个作业,你在开始时没有说明。看到我新添加的链接列表谢谢,我会把这些链接传递给我的朋友,希望这能帮助他们。关于缺乏文档的问题——将其与Java进行比较,你就会明白我的意思。你能评论一下我在问题中添加的代码吗?谢谢。我仍然不确定您在谈论哪些文档,或者是什么类型的文档(核心语言、周围的框架、社区how-tos)。你指的是哪种SML和哪种Java文档?当然,我刚刚用一些额外的东西编辑了这个问题。除了语法方面的小问题,你似乎需要了解什么是函数式编程,以及它与OO的区别。阅读我答案中的相关内容。是的,这可能是主要问题。我在面向对象编程方面做了很多工作,实际上在SML之前从来没有听说过函数式编程。IMO,快速搜索“SML教程”会找到很多链接,足以为OP服务。