【发布时间】:2013-02-12 03:13:47
【问题描述】:
我正在尝试“双重”过滤两个列表,具体取决于痛苦地通过数据类型测试,而无需使用 HOP 进行递归。以下是我非常丑陋的解决方案尝试......
datatype 'a test = Test of ('a -> bool) * string;
fun foo xs lst =
let
fun foo_bar(x, ls) =
let
val tests = (List.filter (fn (Test(f, str)) => (f x)) ls)
in
(List.map (fn (Test(f, str)) => str) tests)
end
in
(List.map (fn x => foo_bar(x, lst)) xs)
end;
allPass: 'a list -> 'a test list -> 'a test list;
allPass [1, 2, 40, 150] [positive, even] 应该返回字符串"pos"。
目前,我的函数正在返回一个嵌套列表:[["pos"], ["pos even"], ["pos even"], ["pos even"]]。有没有一种非递归的方法可以从这个结果中提取“pos”,还是我要以完全错误的方向解决这个问题?
【问题讨论】:
-
也许您可以详细说明一下为什么您希望该函数只返回一个结果,而不是它现在返回的结果列表。此外,您还定义了
foo函数,但在您的示例案例中使用了allPass函数。 -
注意map和fold函数在顶层环境中是可用的,所以你不需要写
List.map。