具有’a * ’a -> int
类型的函数foo
所以我尝试写一些编程:
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
?
谢谢
答案 0 :(得分:1)
我想诀窍是使用x
和y
这样的方式,SML可以推断它们属于同一类型。所以,我认为由于列表只包含相同类型的元素,我们可以将x
和y
放入列表中,这将告诉SML它们属于同一类型。然后我们可以计算列表的大小以返回一个int,并且瞧!
fun foo(x,y) =
let
val items = x::y::[]
in
List.length items
end
提供类型:'a * 'a -> int
答案 1 :(得分:0)
你有一个良好的开端:
fun foo(x,y) = if true then x else y;
因此,您应该只更改返回类型的函数。你应该返回一些Int。并使用明确的类型。
在你的情况下,例子可能是:
fun foo(x :'a, y : 'a) = 1;
但这是明确的定义。如下面Nick Barnes所述,解决方案应该包括将变量添加到列表中:
fun f(x,y) = let val z = [x,y] in 0 end;
答案 2 :(得分:0)
你走在正确的轨道上。您似乎已了解此问题有两个部分:强制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
。您可以将它放在case
表达式中,或者将其传递给另一个类型为'a -> int
的函数。
或者你可以尝试别的东西。列表中的每个元素都必须具有相同的类型。因此,有另一种限制x
和y
类型的方法:将它们放在同一个列表中。然后,您必须弄清楚如何将该列表转换为int
。
答案 3 :(得分:0)
这个很短,不需要任何额外的模块:
fun f (x, y) =
let val y = f (y, x)
in 5 end;
虽然它当然没有终止。
答案 4 :(得分:0)
以下是另外三种方法:
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