[英]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.