2

function foo that has the type ’a * ’a -> int So I tried writing some prog:

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)

What should I do to get ’a * ’a -> int?

thanks

4

5 回答 5

1

我想诀窍是使用SML 可以推断它们属于同一类型的方式xy所以,我认为由于列表只包含相同类型的元素,我们可以将xy放入一个列表中,这将告诉 SML 它们属于相同类型。然后我们可以计算列表的大小以返回一个 int,瞧!

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

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

于 2013-10-23T22:18:42.167 回答
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
于 2013-10-24T06:30:57.193 回答
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;
于 2013-10-23T10:51:49.567 回答
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表达式中,或者将它传递给另一个具有 type 的函数来做到这一点'a -> int

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

于 2013-10-23T14:54:25.730 回答
0

这个很短,不需要任何额外的模块:

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

虽然它当然不会终止。

于 2013-10-23T22:35:46.507 回答