我很難理解Haskell中類型簽名背後的推理。函數類型簽名中的右關聯
1)as ->
被認爲是正確的聯想,這是否意味着它可以以類似的方式被理解爲,例如4 ^(2 ^(3^2))?使用簡單函數的類型簽名,以表達我的疑惑(來解釋我的理解是
2),我會用a
,b
,「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
在所有合同中表示相同類型,看來,c
和d
可以用a
和b
表示。在數學中,類似的任務可能非常簡單,但我如何在Haskell中實現呢?
map :: (a -> b) -> [a] -> [b]
foldr :: (a -> c -> c) -> c -> [a] -> c
(:) :: b -> ([b] -> [b])
(.) :: (b -> d) -> (a -> b) -> a -> d
請將您的問題集中在一個正確的答覆方面。 – leftaroundabout
第1部分涉及的操作是創建一個函數類型。創建「first」的函數類型是'b - > c'。然後將它組合成更大的函數類型'a - >(b - > c)'。請注意,所有這些都屬於類型級別,而不是值級別。 ' - >'是兩種類型的東西,它們會返回一個類型:從左邊類型到右邊類型的函數類型。爲了使事情更具體一點,如果給''>''類型'Char'和'Int',它會讓你從'Char'返回到'Int'的函數類型。 –