[英]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
一个函数接受一个Integer并返回一个Integer。 相比之下,你的第二个例子是一个函数,它采用Integer -> Integer
函数并返回一个Integer
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.