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)
。