sml中的双射函数

sml中的双射函数,sml,smlnj,ml,Sml,Smlnj,Ml,我想定义一个函数,它接受一个整数n并返回一个整数n*,使得n和n*位于从1到n的同一组整数中,并且该函数必须是双射的 我尝试了以下方法 fun bij(n) = let val ls = zip(upto (1, n), List.rev(upto (1, n))) val Tw_2 = fn(a, b) => b in Tw_2(List.last(ls, n-1)) end; 但不幸的是,对于所有的n值,它都返回1。我真的被

我想定义一个函数,它接受一个整数n并返回一个整数n*,使得n和n*位于从1到n的同一组整数中,并且该函数必须是双射的

我尝试了以下方法

fun bij(n) =
      let 
        val ls = zip(upto (1, n), List.rev(upto (1, n))) 
        val Tw_2 = fn(a, b) => b
      in Tw_2(List.last(ls, n-1)) end;
但不幸的是,对于所有的n值,它都返回1。我真的被困在这里了。 有谁能给我一些关于如何实施的想法吗

bij
的行为必须类似

bij(1) = 3
bij(2) = 2
bij(3) = 1

如果我正确理解您的问题,一个简单的解决方案是:

fun bij(n, i) = n + 1 - i;
可由下表表示

i         | 1    2    3  ... n-2  n-1  n
bij(n, i) | n  n-1  n-2  ...   3    2  1
并且对于介于
1
n
之间的数字,它的作用与预期相同。直观地说,一个(正)数字
i
i
步数“在
0
的右侧”,我们将其映射到一个数字,即
i
(实际上
i-1
)步数“在
n
的左侧”

也许您想通过列表显式地构造上面的表

fun upto(m, n) = if n < m then [] else m :: upto(m+1, n);

fun table n = ListPair.zip (upto(1, n), List.rev (upto(1, n)));
然后要获取列表的第i对
xs
,可以使用

List.nth (xs, i-1)
综合

fun bij(n, i) =
      let
        val table = ListPair.zip (upto(1, n), List.rev (upto(1, n)));
        fun snd(x, y) = y;
      in snd(List.nth (table, i-1)) end;

它的作用与初始函数相同,只是方式更复杂。

您是否希望定义一个函数,该函数接受整数n并返回一个函数,该函数接受整数m并返回整数m*,这样m和m*位于从1到n的同一组整数中?我不明白,在您的第一个示例中,n=1,n*=3。那么n和n*是如何在从1到n的同一组整数中的呢?当然,n*应该是介于1和n之间的整数。你能不能请elaborare?也许我没有解释我真正想要的是什么,大局是这样的:我有一个列表“[2,1,3]”,我想要一个将这个列表重新排列回“[1,2,3]”的函数。例如,这里缺少一些东西。。。您希望
bij(1)
返回一个介于
1
n
之间的值,但您没有告诉它
n
是什么。它需要另一个参数。在上面的代码中是
zip
实际上
ListPair.zip
?那么
的定义是什么?此外,
List.last
只接受一个参数,您实际指的是哪个函数?您只需要满足您的规范的任意函数(想到的最简单的函数是
fnx=>x
;)还是特定的函数?在您的示例中,似乎对于给定的
n
bij(n,i)
应该映射数字
13。。。n
(按此顺序)到
n n-1 n-2。。。1
(按此顺序)?你能澄清一下吗?
fun bij(n, i) =
      let
        val table = ListPair.zip (upto(1, n), List.rev (upto(1, n)));
        fun snd(x, y) = y;
      in snd(List.nth (table, i-1)) end;