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() 函数的主要内容,如果未能解决你的问题,请参考以下文章