[英]How does Haskell evaluate this signature?
ggt_euklid :: Nat1 -> (Nat1 -> Nat1)
我正在嘗試學習部分應用程序,我知道在這種情況下,如果省略括號,我將得到相同的結果,但是我不知道應該如何評估此簽名。
據我了解,括號表示它是一個函數嗎? 這是否意味着ggt_euklid取值Nat1並返回函數?
以下是完整的功能:
ggt_euklid x y
| x == y = x
|x>y =ggt_euklid(x-y) y
|x<y =ggt_euklid x (y-x)
您已經正確理解了類型簽名:它接受一個參數並返回一個函數。 Haskell中的“多參數”函數就是這樣工作的:通過咖喱化。 您可以通過嘗試以下等效實現來查看實際情況:
ggt_euklid :: Nat1 -> (Nat1 -> Nat1)
ggt_euklid x = \y -> result
where result | x == y = x
| x > y = ggt_euklid (x-y) y
| x < y = ggt_euklid x (y-x)
在這里,我已經介紹了這個相當毫無意義的result
變量,可以將其用作模式防護,但是想法是相同的。
這是否意味着ggt_euklid取值Nat1並返回函數?
不 ,它仍然意味着ggt_euklid
需要一個類型的一個參數Nat1
和返回類型的函數Nat1->Nat1
,盡管中 , 括號去掉。
箭頭->
始終是右關聯性(沒有括號時),即:
Nat1 -> Nat1 -> Nat1
相當於
Nat1 -> (Nat1 -> Nat1)
與功能應用程序相對應的總是左關聯性。 (如果沒有括號),例如:
ggt_euklid 1 2
相當於
(ggt_euklid 1) 2
這里
(ggt_euklid 1) ~ Nat1 -> Nat1
和
(ggt_euklid 1) 2 ~ Nat1
所以,不管一個或兩個參數是否適用於ggt_euklid
,它總是返回類型的函數Nat1 -> Nat1
首先,如果提供了第二個參數,它適用於第二個參數返回的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.