Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
Sml 函数foo的类型为’;a*’;a->;int_Sml_Smlnj - Fatal编程技术网

Sml 函数foo的类型为’;a*’;a->;int

Sml 函数foo的类型为’;a*’;a->;int,sml,smlnj,Sml,Smlnj,类型为'a*'a->int 所以我试着写一些程序: fun foo(x,y)=6;(*here the type is ’a * ’b -> int*) fun foo(x,x) =5; (*gives error cause of two x*) fun foo(x,y) = if true then x else y; (give 'a * 'a -> 'a) 我应该如何获得'a*'a->int 谢谢您有了一个良好的开端: fun-foo(x,y)=如果为真,则为x,否则为y

类型为
'a*'a->int
所以我试着写一些程序:

fun foo(x,y)=6;(*here the type is ’a * ’b -> int*)
fun foo(x,x) =5; (*gives error cause of two x*)
fun foo(x,y) = if true then x else y; (give 'a * 'a -> 'a)
我应该如何获得
'a*'a->int


谢谢

您有了一个良好的开端:

fun-foo(x,y)=如果为真,则为x,否则为y

所以,您应该只更改函数的返回类型。您应该返回一些Int。并使用显式类型

在您的案例中,示例可能是:

fun  foo(x :'a, y : 'a) = 1;
但这是明确的定义。如下所述,解决方案应包括向列表中添加变量:

 fun f(x,y) = let val z = [x,y] in 0 end;

你在正确的轨道上。看起来您已经理解了这个问题有两个部分:强制
x
y
具有相同的类型,以及强制
foo
返回整数

你与
fun-foo(x,x)=5接近。我想你的意思可能是这样的:

fun foo (x,y) = if x=y then 1 else 0;
这就给出了
“a*”a->int
,这非常接近,但并不完全符合您的需要<代码>''a
'a
不同-一个破折号表示“任何类型”,两个破折号表示“任何可以进行相等比较的类型”。换句话说,我们只是通过说
x=y
来限制类型

您已经确定了一种强制类型相同的方法:将它们放入
if
表达式的结果中。现在剩下的就是将
if
(其类型为
'a
)的结果转换为
int
。您可以将它放在一个
大小写
表达式中,或者将它传递给另一个类型为
'a->int
的函数


或者你可以试试别的。列表中的每个元素都必须具有相同的类型。因此,还有另一种方法来限制
x
y
的类型:将它们放在同一个列表中。然后你需要弄清楚如何将这个列表转换成
int

我想诀窍是使用
x
y
,这样SML就可以推断出它们是同一类型的。因此,我认为由于列表只包含相同类型的元素,我们可以将
x
y
放入一个列表,这将告诉SML它们是相同类型的。然后我们可以计算列表的大小以返回一个int,瞧

fun foo(x,y) = 
    let
       val items = x::y::[]
    in
       List.length items
    end

给定类型:
'a*'a->int

此类型较短,不需要任何附加模块:

fun f (x, y) = 
  let val y = f (y, x) 
  in 5 end;

当然,它不会终止。

为您的收藏提供另外三种方法:

fun f1(x, y) = if false then f1(y,x) else 1

fun f2(x, y) = let val r = ref x
               in  r := y
                 ; 0
               end

fun f3(x, y) = let exception E of 'a
               in  (raise E x)
                   handle (E _) => (raise E y)
                                   handle E _ => 0
                end

fun-foo(x,y)=如果为真,则为1,否则为2;在这个例子中,我得到了类型a'*b'->int,我想要a'*a'->int,我尝试了你的有趣的方法foo(x,y)=如果是真的,那么1其他2;在这里,我得到类型a'*b'->int,我想要一个'*a'->int,带有显式类型:fun foo(x:'a,y:'a)=1@user987339,我想这是一个家庭作业问题,我还假设显式类型注释不是练习的重点。是的,它实际上是家庭作业的一部分,但不是问题所在。我只是想知道一个函数如何具有相同的alpha类型并返回任何beta值。顺便说一句,非常感谢你的时间和耐心。重复@Andreas Rossberg,如果我写的是:fun f(x,y)=如果x=y,那么0其他1;我得到了val f=fn:“a*”a->int.“a”和“a”之间有什么区别?@Andreas Hah,我几乎连读都没读就复制粘贴了你的答案:)@user987339下面是我的答案谢谢你Nick你消除了我很多基本的疑问。“(“a”与“a”不同-一个破折号表示“任何类型”,两个破折号表示“任何类型,可以进行相等比较”。”不需要
,只需
fun foo(x,y)=length[x,y]
一个很好的短方法,可以将返回类型固定为
int
fun f(x,y)=1+f(y,x)
。如果您想要终止某些内容,可以利用lazy If-else计算:
fun f(x,y)=如果为true,则使用1 else f(y,x)