簡體   English   中英

Haskell中的函數減少如何工作?

[英]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。 fxf是(反之亦然)被稱為η-轉換 [wiki] 在Haskell中,它歸結為重寫:

f x = g x

至:

f = g

運營商也不例外。 事實上,如果你在Haskell中寫a + b ,你寫(+) ab ,用(+)一個函數,或者更詳細((+) a) b

where子句中的f

f a b c = a + b

例如可以轉換為:

f = (.) ((.) const) (+)

它被稱為eta 減少

您也可以考慮部分應用。

> calculate :: Integer -> Integer -> Integer
> f :: Integer -> Integer -> Integer -> Integer
> (f 1) :: Integer -> Integer -> Integer

類似的問題 - 在HLint的背景下,eta減少了什么意思

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM