Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java转换为标准ML(SML)_Java_Encryption_Recursion_Cryptography_Sml - Fatal编程技术网

将Java转换为标准ML(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

我的几个朋友正在SML中开发一个简单的递归函数,但由于缺乏SML及其语法的文档,到目前为止还未能创建它。为了帮助他们,我试着自己找点东西,但到目前为止都没有成功

这是我用Java编写的函数。它可以工作,我想把这个函数的概念转换成SML

 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服务。