SML 比较数据类型列表和 hd() tl() 函数

SML Comparing datatype list and hd() tl() function

像这样的 2 数据类型。

datatype flight = F of int * int; 
datatype flights = Fs of flight list;

我想做一个函数来检查 (a,b) 是否在航班上。

示例:

val reachable = fn : flights * (int * int) -> bool

reachable (Fs [F(0,1), F(1,0)], (0, 1));
val it = true : bool

我不知道如何比较 (int*int) 和航班。

我用

fun get_f_x (F(x,y)) = x;

获取飞行中的第一个整数。

但是当我尝试对航班做同样的事情时。

我这样做如下:

fun test_hd(Fs[i,_]) = i;

为了抢到第一个出门的航班。 但它只能乘坐只有2个航班的航班(Fs [F(0,1),F(1,0)]) 如果航班有超过 2 个元素,它会显示错误。

同样

fun test_tl(Fs[_,i]) = i;

遇到同样的问题

如何为航班制作高清和TL?或者思考这个问题的正确方法是什么?

没有看到您遇到的错误,这很难说,但查看您显示的代码,我怀疑不详尽的模式匹配是一个因素。考虑到这一点,让我们看一下分解所涉及的递归和模式匹配的方法。

如果你想知道一个特定的航班是否在航班中,首先我们需要从我们绝对知道的开始:如果一个 flights 值在其列表中不包含任何值,那么答案一定是 false ,无论我们在寻找什么。

fun reachable(Fs([]), _) = false

如果该列表中有内容怎么办?好吧,让我们检查第一个元素,看看它是否是我们要找的。

fun reachable(Fs([]), _) = false
  | reachable(Fs(F(x) :: xs), flt) = flt = x

但如果那个不匹配,其余的怎么办?我们需要检查列表的其余部分。

fun reachable(Fs([]), _) = false
  | reachable(Fs(F(x) :: xs), flt) = 
      flt = x orelse reachable(Fs(xs), flt)