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

Posted

技术标签:

【中文标题】SML 比较数据类型列表和 hd() tl() 函数【英文标题】:SML Comparing datatype list and hd() tl() function 【发布时间】:2021-11-24 01:59:33 【问题描述】:

对于这样的 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?或者思考这个问题的正确方法是什么?

【问题讨论】:

在模式中使用[] 指定的列表是为了精确匹配。例如,F[x] 之类的模式将匹配恰好包含 1 个元素的列表,F[x, y] 将匹配恰好包含 2 个元素的列表,依此类推。但是,我们可以使用F(x::ys) 构造指定一个模式来匹配任何列表,Empty 列表除外。 【参考方案1】:

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

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

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

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

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)

【讨论】:

以上是关于SML 比较数据类型列表和 hd() tl() 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何比较和搜索列表中的元素与列表 SML 中的元组

SML 中的数据类型和类型未按预期工作

SML - 使用延续在 trie 中收集单词

在 SML 中查找二叉树的最深元素

SML 中的一个对列表进行切片的函数?

给定 SML 中的变量列表,生成所有真值赋值的列表?