Recursion SML:调用自身另一个实例化的多态函数

Recursion SML:调用自身另一个实例化的多态函数,recursion,polymorphism,sml,Recursion,Polymorphism,Sml,有没有一种方法可以编写一个多态函数(在sml中),它使用不同类型的参数来调用自己 例如,我正在查看,(它具有声明数据类型('a,'b)alterlist=Nil |元素'a*('b,'a)alterlist;),直观地说,我想实现函数解压,如下所示: fun unzip Nil = ([],[]) | unzip (element(x,l)) = let val (b,a)=unzip l in (x::a,b) end; 类型推断系统将其理解为('a,'a)alterlist->'a

有没有一种方法可以编写一个多态函数(在sml中),它使用不同类型的参数来调用自己

例如,我正在查看,(它具有声明
数据类型('a,'b)alterlist=Nil |元素'a*('b,'a)alterlist;
),直观地说,我想实现函数
解压
,如下所示:

fun unzip Nil = ([],[]) |
    unzip (element(x,l)) = let val (b,a)=unzip l in (x::a,b) end;

类型推断系统将其理解为
('a,'a)alterlist->'a list*'a list
,但我想要
('a,'b)alterlist->'a list*'b list
(这样内部调用是a
('b,'a)alterlist->'b list*'a list
)类型的东西。

我相信你想要的是,这不是在标准ML中实现的

然而,这是在Haskell中实现的(正如@seanmcl所指出的,ocaml):

导入前奏隐藏(解压缩)
数据变更列表a b=Nil |元素a(变更列表b a)
解压::Alterlist a b->([a],[b])
解压Nil=([],[])
解压(Elem x l)=
让(b,a)=解压l
in(x:a,b)
x=元素1(元素真(元素5(元素假零)))
*主>解压x
([1,5],[True,False])

ocaml也支持多态递归