【发布时间】:2019-05-19 04:59:11
【问题描述】:
如果我有这个代码:
fun coord_select (x : int, cs : (int*int) list) =
List.filter (fn (first, _) => first = x ) cs
使用输入进行测试给出了以下结果:
coord_select (2, [(2,2),(2,3),(3,3),(4,3)])
: val it = [(2,2),(2,3)] : (int * int) list
现在,如果我没有将所需的第一个坐标作为int 给出,而是作为几个所需的第一个坐标的列表,例如 [3,4],即,我希望所有以 3 开头的坐标元组为以及4?简单的方法是简单地围绕它创建一个递归包装器,它遍历列表并将值作为coord_select 的第一个变量插入。但我想比这种蛮力更好地理解嵌套的东西。所以我想出了这个:
fun coord_match (fs : int list, cs :(int*int) list) =
map (coord_select (f, cs)) fs
但这并不能真正起作用,因为正如所指出的那样,map 中的coord_select 实际上是在尝试返回一个列表——map 如何知道插入fs 的成员首先进入f? Common Lisp 确实有一个设备来阻止这样的函数运行,即' 运算符。但这也无济于事,因为map 不知道fs 提供的是哪个变量。对于输入,例如,我有这些坐标:
[(2,2),(2,3),(3,3),(4,3)]
我有这个 x 坐标列表来匹配上面的列表
[3,4]
同样,我可以对此进行递归包装,但我正在从更大的 fold 家族中寻求更优雅的嵌套解决方案。
【问题讨论】:
-
先算出所有类型。例如,
coord_select (f, cs)是一个(int * int) list,而不是一个函数(或者,如果存在f,则将是一个函数),并且将'a -> 'b list函数映射到'a list将产生'b list list,而不是@987654345 @。 (提示:研究折叠。) -
我想我现在明白了。 IOW,我在
map中的coord_select (f, cs)正在返回一个元组列表,即它不是一个适用的函数。唉,初学者的不走运.... -
@Simon Shine:这是一个延续。唯一不同的是,之前,我只让它过滤一个坐标值。这次是值列表。实际上,您的
filter建议就是我解决它的方法。请参阅上文了解我是如何实现它的。 -
@147pm:在这种情况下,您的要求有点不清楚。既然你问的是一个是/否的问题,你会满足于“是”吗?也许如果您扩展了您正在做的事情并将问题包含在一个问答中,而不是针对学习过程中的每个步骤一个问答,这将不符合“重复”或“不清楚”或@ 987654322@.