0

我很難理解Haskell中類型簽名背後的推理。函數類型簽名中的右關聯

1)as ->被認爲是正確的聯想,這是否意味着它可以以類似的方式被理解爲,例如4 ^(2 ^(3^2))?使用簡單函數的類型簽名,以表達我的疑惑(來解釋我的理解是

2),我會用ab,「S或Int」的c代替Num a => a S):

myAdd :: a -> b -> c 
myAdd x y = x+y 

這意味着函數採用參數a並返回函數,它b最後返回c

但也有可能被重新寫爲:

myAdd :: (a->(b->c)) 

由於大部分學習材料的規定,c在我們的例子是功能myAdd的結果,爲什麼要按使用括號表示,首先「操作」是b->c?我如何從該類型簽名推斷執行操作的順序?

3)我得到了一個任務

map f xs 

使用foldr(.)(:)這導致實現:

map f xs = foldr ((:) . f) [] xs 

我沒有問題的理解上述功能的工作原理,但在這裏我們再來 - 輸入簽名。如果我們假設,這些名稱是統一的,所以類型a在所有合同中表示相同類型,看來,cd可以用ab表示。在數學中,類似的任務可能非常簡單,但我如何在Haskell中實現呢?

map :: (a -> b) -> [a] -> [b] 
foldr :: (a -> c -> c) -> c -> [a] -> c 
(:) :: b -> ([b] -> [b]) 
(.) :: (b -> d) -> (a -> b) -> a -> d 
+3

請將您的問題集中在一個正確的答覆方面。 – leftaroundabout

+0

第1部分涉及的操作是創建一個函數類型。創建「first」的函數類型是'b - > c'。然後將它組合成更大的函數類型'a - >(b - > c)'。請注意,所有這些都屬於類型級別,而不是值級別。 ' - >'是兩種類型的東西,它們會返回一個類型:從左邊類型到右邊類型的函數類型。爲了使事情更具體一點,如果給''>''類型'Char'和'Int',它會讓你從'Char'返回到'Int'的函數類型。 –

回答

5

用你的符號,在

myAdd :: a -> b -> c 
myAdd x y = x+y 

你正確地解釋類型a -> (b->c)但你去上建議,在b -> c計算以某種方式首先完成。

當像myAdd 2 10這樣的東西被評估,功能評估是從左到右。

1)首先評估myAdd 2。該評估的結果是將給定號碼y發送到2 + y的功能。實際上,的myAdd定義相同

myAdd x = \y -> x+y 

2)然後,將該最後一個函數被施加到參數10得到2 + 10 = 12

因此,->的右結合在型表達不對應於功能評估中從右到左排序的計算。事實上,功能評估是左聯的:myAdd 2 10(myAdd 2) 10相同。

+0

我的確瞭解了函數評估的左關聯性,但是在類型表達式中並沒有' - >'的右關聯性。 –

+5

類型表達式說明* *是什麼* - 它們沒有指定計算順序。 'a - >(b - > c)'表示一個類型爲'a'的元素映射到'''是一個函數,它將'b'類型的元素髮送給'c'類型的元素。把它看作是組成部分的邏輯分組,而不是計算的時間分組。 –