繁体   English   中英

如何理解Haskell中的“Currying”?

[英]How to understand the “Currying” in Haskell?

假设有一个名为“smallc”的函数

    smallerc :: Integer -> (Integer->Integer)
    smallerc x y = if x <=y then x else y

为什么不使用以下方式声明函数:

    smallerc :: (Integer -> Integer) ->Integer

谢谢!

理解currying的关键是理解不存在具有多个参数的函数。 haskell中的每个函数都只有一个参数。 但是由于->运算符的右关联属性,这并不是立即清楚的。

当你看到这个:

Integer -> Integer -> Integer

它相当于:

Integer -> (Integer -> Integer)

在这两种情况下,该函数都接受一个Integer返回一个函数 (返回的函数是一个取Integer并返回一个Integer的函数。)所以这可能就像一个简单的数学运算; 它需要一个Integer (假设为5)并返回一个函数,它接受另一个Integer (再次为5)并将其添加到第一个,并返回结果(10)。

但是当你这样做时:

(Integer -> Integer) -> Integer

你创造了一些非常不同的东西 - 一个接受一个函数并返回一个Integer的函数。 这也可以是实现数学函数的一种方式; 但不是将Integer作为第一个参数,而是采用数学运算本身! 因此,例如,假设您向此函数传递一个函数,该函数将5传递给它。 然后该函数将5传递给函数,并返回结果(10)。

Arrow运算符是右关联的。 意思是,你的第一个例子是一个函数接受一个Integer并返回Integer -> Integer一个函数接受一个I​​nteger并返回一个Integer。 相比之下,你的第二个例子是一个函数,它采用Integer -> Integer函数并返回一个Integer

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM