假设有一个名为“smallerc”的函数
smallerc :: Integer -> (Integer->Integer)
smallerc x y = if x <=y then x else y
为什么不使用以下方法声明函数:
smallerc :: (Integer -> Integer) ->Integer
谢谢!
假设有一个名为“smallerc”的函数
smallerc :: Integer -> (Integer->Integer)
smallerc x y = if x <=y then x else y
为什么不使用以下方法声明函数:
smallerc :: (Integer -> Integer) ->Integer
谢谢!
理解柯里化的关键是要理解没有一个函数具有多个参数。haskell 中的每个函数都只有一个参数。但由于->
运算符的右关联属性,这并不能立即清楚。
当你看到这个:
Integer -> Integer -> Integer
它等价于:
Integer -> (Integer -> Integer)
在这两种情况下,函数都接受一个Integer
并返回一个函数。(返回的函数是一个接受一个Integer
并返回一个的函数Integer
。)所以这可能类似于一个简单的数学运算;它接受一个Integer
(假设是 5)并返回一个函数,该函数接受另一个Integer
(再次为 5)并将其添加到第一个,并返回结果(10)。
但是当你这样做时:
(Integer -> Integer) -> Integer
你创建了一些非常不同的东西——一个接受一个函数并返回一个Integer
. 这也可能是实现数学函数的一种方式;但不是将 anInteger
作为第一个参数,而是采用数学运算本身!例如,假设您向该函数传递了一个函数,该函数将传递给它的任何内容加 5。然后该函数传递5
给该函数,并返回结果 (10)。
箭头运算符是右结合的。意思是,您的第一个示例将是一个函数,该函数接受一个Integer
并返回Integer -> Integer
一个函数,该函数接受一个整数并返回一个整数。相比之下,您的第二个示例将是一个函数,该函数接受一个Integer -> Integer
函数并返回一个Integer
.