将Java转换为标准ML(SML)

时间:2011-09-18 11:40:48

标签: 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 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;

2 个答案:

答案 0 :(得分:3)

网上有大量的书籍和资源(见下文)。

您需要函数divmod,然后是一些通用的功能原则,例如递归来解决这个问题。 我不打算给你任何代码,因为它是每周一次的任务。但是,我非常乐意帮助解决与此任务无关的更具体问题。

链接


  

我见过的所有例子都只包含非常简单的if-else语句

然后我敢说你没看好!请参阅上面的链接列表,其中至少有一些链接包含不同级别的SML介绍。

  与其他语言相比,SML的文档是荒谬的。

你并没有真正提到你正在谈论的文件,但我只能猜测它不是定义/评论。无论如何,你似乎不知道你在说什么!

  

我的朋友已经能够使用两个函数将其“转换”为SML而不是一个函数,但是当它应该非常简单时,这样做似乎很愚蠢。

确实,一旦理解了功能原则,它实际上非常简单。我再次高兴地就具体问题发表意见。

答案 1 :(得分:0)

从查看代码开始,我看到的主要内容是您尝试分配给变量(您编写的内容类似firstRun = false,但=实际上是等于运算符)。 ML中的变量不能分配给(因此“变量”是用词不当;它们在某种意义上实际上是常量)。您可以重新编写代码以不使用变异,也可以使用显式可变单元格(称为“引用”)。对于可变单元格,基本上,您使用ref函数创建具有给定初始值的可变单元格。您使用!运算符来获取单元格的值;并使用:=运算符更改单元格内的值。

但是,我认为在您的情况下使用可变全局状态是个坏主意。这是糟糕的风格,它似乎会使你的功能不能使用多次。从我所看到的,您在对函数进行递归调用时使用全局变量来跟踪信息。您可以改为定义一个执行递归的内部函数(外部函数的本地函数),这样您就可以跟踪外部函数的局部变量中的东西和/或在递归内部函数时传递其他变量,而不会暴露陈述全球范围。

此外,您不会使用var声明变量;你可能想要val