Mat*_*att 5 haskell currying partial-application
所以像
addList :: [int] -> int
addList = foldl1 (+)
Run Code Online (Sandbox Code Playgroud)
为什么这样做?Currying部分.为什么没有变量?
sep*_*p2k 11
如果你定义一个类似的函数f x y = bla,它就是相同的f x = \y -> bla,它是相同的f = \x -> (\y -> bla).换句话说,f是一个函数,它接受一个参数,x并返回另一个带有一个参数的函数y,然后返回实际结果.这被称为currying.
类似的,当你这样做时f x y,它就像(f x) y.即你f用参数调用函数x.这将返回另一个应用于参数的函数y.
换句话说,当你这样做时addList xs = foldl1 (+) xs,你首先调用foldl1 (+)然后返回另一个你应用的函数xs.因此,由于返回的函数foldl1 (+)实际上与它相同addList,所以您可以将它缩短为addList = foldl1 (+).
除了currying,正如sepp2k所指出的,这里我们使用所谓的eta减少.这是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.为证明它需要任意c : a并将其应用于g:g c = (\x -> f x) c = f c,最后的等式是另一个称为beta减少的规则,它表示函数应用程序是通过替换来评估的.
| 归档时间: |
|
| 查看次数: |
2021 次 |
| 最近记录: |