列表上的广泛地图和过滤器操作 - ML

时间:2014-05-07 14:18:26

标签: list predicate ml

我一直在尝试创建一个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; 

我做错了什么?

1 个答案:

答案 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来跟踪旧值(您在谓词中使用的值)和生成的值。


您的代码仅使用每对函数一次,每个数字一次。您始终将ysxs放入递归函数中,以相同的速率运行它们,而不是运行第一个,第二个向下移动,然后再运行第一个。当您想要max(length(ys),length(xs))时,您正在执行length(ys)*length(xs)次操作。