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

哈斯克尔-咖喱?需要进一步解释

  •  5
  • Matt  · 技术社区  · 16 年前

    所以有点像

    addList :: [int] -> int
    addList = foldl1 (+)
    

    为什么会这样?货币部分。为什么没有变量?

    3 回复  |  直到 13 年前
        1
  •  11
  •   sepp2k    16 年前

    如果你定义一个函数 f x y = bla ,这和 f x = \y -> bla ,与 f = \x -> (\y -> bla) . 换句话说 f 是一个接受一个参数的函数, x ,并返回另一个接受一个参数的函数, y ,然后返回实际结果。这就是所谓的咖喱。

    当你这样做的时候 f x y ,和 (f x) y . 也就是说,你在调用函数 F 有了争论 X . 这将返回另一个应用于参数的函数 Y .

    换句话说,当你这样做的时候 addList xs = foldl1 (+) xs ,你是第一个打电话的人 foldl1 (+) 然后返回另一个函数,应用于 xs . 因此,由于函数返回 文件夹1(+) 实际上和 addList ,你可以把它缩短到 addList = foldl1 (+) .

        2
  •  5
  •   Daniel    16 年前

    除咖喱外,正如SEPP2K指出的,这里我们使用所谓的 eta reduction . 它是lambda微积分的一个约化规则,是haskell的基础。上面写着 \x -> f x 等于 f 什么时候? x 不出现在 F .

    让我们把它应用到你的案例中。我想你对这样的定义很满意 addList xs = foldl1 (+) xs . 我们可以把这个改写为 addList = \xs -> foldl1 (+) xs 现在应用ETA缩减规则 addList = foldl1 (+) .

    这个规则是基于这样一个理念:如果两个函数在应用于同一个参数时产生相同的结果,那么它们是相等的。这里的两个功能是 F 和 g = \x -> f x 在哪里? f : a -> b 我们想向大家展示这一点 c : a , f c = g c . 为了证明这是武断的 甲:甲 并应用于 g : g c = (\x -> f x) c = f c ,最后一个等式是由另一个称为beta reducation的规则实现的,该规则表示函数应用程序是通过替换来评估的。

        3
  •  2
  •   Landei    16 年前

    SEPP2K的解释是正确的,我只是想指出(双关语的意思)这个应用程序有一个名字:它被称为“无点风格”。下面是一个很好的解释,包括优点和缺点: http://www.haskell.org/haskellwiki/Pointfree

    推荐文章