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)
像这样的 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)