[英]How function reduction in Haskell works?
为什么在Haskell中减少函数是可能的:
calculate :: Integer -> Integer -> Integer
calculate a b = f 1 a b
where
f :: Integer -> Integer -> Integer -> Integer
f a b c = a + b
进入某事:
calculate :: Integer -> Integer -> Integer
calculate = f 1
where
f :: Integer -> Integer -> Integer -> Integer
f a b c = a + b
我只需要一些指导,任何我可以找到答案的资源,阅读更多有关它的信息会非常有用。
在Haskell中, 没有函数可以使用多个参数。 所有函数都只有一个参数。
因此,如果你有一个像add :: Int -> Int -> Int
这样的函数,那么这实际上是add :: Int -> (Int -> Int)
缩写。
为什么括号重要? 因为他们展示了这个概念的运作方式 如果我们有这个函数add
,那么我们可以用例如14
创建一个函数应用程序,然后我们构造一个新函数,如:
add14 :: Int -> Int
add14 = add 14
所以这意味着我们现在有一个函数再次获取一个参数(这里是一个Int
),现在它将生成另一个Int
,它通过向它添加14来实现,所以add14 25
将导致39
。
如果你编写add 14 25
,那么这不是一个带有两个参数的函数应用程序,你实际写的是:
-- add 14 25 is equivalent to
(add 14) 25
因此,您首先使用14
进行调用,然后使用由此产生的函数调用,并将25
作为参数。
为什么这很重要? 因为这意味着如果你这样写
calculate = f 1
它意味着你的f 1
,构造一个函数,一个带有签名Int -> (Int -> Int)
的函数。 在calculate
头中创建参数,并将这些参数添加到f 1
的末尾,这是没有意义的:你已经构建了一个无论如何都需要这些参数的函数。 所以它只会引入噪音。
在lambda演算中 ,重写规则,其中一个重写λx。 fx到f是(反之亦然)被称为η-转换 [wiki] 。 在Haskell中,它归结为重写:
f x = g x
至:
f = g
运营商也不例外。 事实上,如果你在Haskell中写a + b
,你写(+) ab
,用(+)
一个函数,或者更详细((+) a) b
。
where子句中的f
:
f a b c = a + b
例如可以转换为:
f = (.) ((.) const) (+)
您也可以考虑部分应用。
> calculate :: Integer -> Integer -> Integer
> f :: Integer -> Integer -> Integer -> Integer
> (f 1) :: Integer -> Integer -> Integer
类似的问题 - 在HLint的背景下,eta减少了什么意思
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.