函数foo具有类型'a *'a - > INT

时间:2013-10-23 09:07:29

标签: sml smlnj

具有’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

谢谢

5 个答案:

答案 0 :(得分:1)

我想诀窍是使用xy这样的方式,SML可以推断它们属于同一类型。所以,我认为由于列表只包含相同类型的元素,我们可以将xy放入列表中,这将告诉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)

你走在正确的轨道上。您似乎已了解此问题有两个部分:强制xy具有相同的类型,并强制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的函数。

或者你可以尝试别的东西。列表中的每个元素都必须具有相同的类型。因此,有另一种限制xy类型的方法:将它们放在同一个列表中。然后,您必须弄清楚如何将该列表转换为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