我一直在尝试创建一个ML函数(curried),它从表单中获取元组列表:(谓词,函数)和一个列表,并返回每个返回true的元素的函数操作,即每个条件有一定的功能要执行,例如:
- map_many [(fn x => x mod 2 = 0, fn x => x*2), (fn x => x mod 3 = 0, fn x => x+5), (fn x => x mod 4 = 0, fn x => x*x)] [1,2,3,4,5,6,7,8,9,10];
val it = [1,4,8,64,5,17,7,256,14,20] : int list
这就是我一直想做的事情,但它没有那么好用:
fun map_many _ [] = []
| map_many [] _ = []
| map_many ((y,z)::ys) (x::xs) =
if (y(x) = true)
then z(x)::map_many ys xs
else
x::map_many ys xs;
我做错了什么?
答案 0 :(得分:1)
这将提供您想要的输出。
fun map_one [] (old,x) = x
| map_one ((p,f)::fs) (old,x) =
if p old
then map_one fs (old,(f x))
else map_one fs (old,x)
fun map_many _ [] = []
| map_many fs (x::xs) = map_one fs (x,x) :: map_many fs xs
请注意,map_one
使用元组int*int
来跟踪旧值(您在谓词中使用的值)和生成的值。
您的代码仅使用每对函数一次,每个数字一次。您始终将ys
和xs
放入递归函数中,以相同的速率运行它们,而不是运行第一个,第二个向下移动,然后再运行第一个。当您想要max(length(ys),length(xs))
时,您正在执行length(ys)*length(xs)
次操作。