代码之家  ›  专栏  ›  技术社区  ›  jtolle

“map”之类的函数是否有一个典型的名称,该函数在参数列表(而不是多个参数列表)上操作?

  •  7
  • jtolle  · 技术社区  · 16 年前

    (我最后发表并接受了一个回答:“不,没有,问题实际上不是那么普遍”。)

    考虑常见的lisp函数“mapcar”。它将一个函数和一些列表作为参数,并使用从每个列表中相同位置提取的参数调用函数。

    标准库是否通常有一个采用单个列表的类似函数,其中列表中的每个元素都是函数的参数列表?通常称为“标准”或“非标准”的函数是什么?(这不是一个Lisp问题,但它是我所知的唯一一个功能语言+库。)

    我想我是在问一个像(伪lisp)这样的操作:

    (mapcar (curry #'apply function-to-map) list-of-arg-lists)
    

    已经有了一个跨多种语言或库通用的名称(就像“map”和“reduce”是通用操作的名称,而不仅仅是特定的库函数)。

    谢谢。

    3 回复  |  直到 16 年前
        1
  •  3
  •   Harold L    16 年前

    我提名 map-apply 或者也许 mapply 如果你只想自己使用它,或者在一个小组中使用它。

    (defun map-apply (fn arg-lists)
        (mapcar (lambda (arg-list) (apply fn arg-list))
                arg-lists))
    
    (map-apply #'+ '((1 2) (3 4 5)))
      =>
    (3 12)
    

    编辑 当然,如果你有假口齿不清 curry :

    (defun curry (f &rest values)
        (lambda (&rest more-values)
            (apply f (append values more-values))))
    
        2
  •  1
  •   Dario    16 年前

    考虑常见的lisp函数“mapcar”。它将一个函数和一些列表作为参数,并使用从每个列表中相同位置提取的参数调用函数。

    标准库是否通常有一个采用单个列表的类似函数,其中列表中的每个元素都是函数的参数列表?

    好吧,haskell定义了一系列 zipWithN -作用类似于 mapcar 对于常量参数计数。

    zipWith (\a b -> a + b) [1, 2, 3] [1, 2, 3]                   => [2, 4, 6]
    zipWith3 (\a b c -> a + b + c) [1, 2, 3] [1, 2, 3] [4, 5, 6]  => [6, 9, 12]
    

    将此概念概括为列表列表将导致此(初步实现的)函数 zipWithMany

    zipWithMany :: ([a] -> b) -> [[a]] -> [b]
    zipWithMany f lists 
        | any null lists = []
        | otherwise      = (f $ map head lists) : zipWithMany f (map tail lists)
    

    例子:

    zipWithMany sum [[1, 2, 3], [1, 2, 3], [1, 2]] => [3, 6]
    
        3
  •  1
  •   jtolle    16 年前

    对于那个特定的操作,实际上没有一个典型的“函数式编程”名称。事实上,我对这个问题的措词方式预设了一种工作方式类似于lisp的语言,其中函数应用于参数列表。它还假定,首先的“映射”意味着执行Lisp的“mapcar”之类的操作。

    不是每种语言都是这样工作的。例如,haskell函数只接受一个类型化参数(参见其他答案和注释,以及 http://www.haskell.org/tutorial/index.html )映射一个在该类型的列表上接受元组类型的函数在概念上类似于我询问的操作,在这种情况下,相关函数是…“map”。

    就Lisp而言,这只是通过参数映射函数的“mapcar”版本的工作方式——它压缩作为输入的列表,并应用函数映射到生成的参数列表。其他一些函数也可以很容易地使用压缩参数列表,而仍然被称为“map”的某种变体。

    感谢每一个为我做出贡献的人,对我来说,这是非常有教育意义的。

    推荐文章