我想我在寫出步驟時理解函式應用程式是如何作業的,但是型別簽名演算法并沒有在我的腦海中加起來。為漫長的前奏道歉(沒有雙關語)。
舉一個具體的例子,這個來自Stefan H?ck 的 Idris2 教程:
plusTwo : Integer -> Integer
plusTwo = ( 2)
twice : (Integer -> Integer) -> Integer -> Integer
twice f n = f (f n)
在 REPL 中:
> twice plusTwo 3
7
> (twice . twice) plusTwo 3
11
我知道的
Haskell 和 Idris 中的函式都是柯里化的,每個函式只接受一個引數
功能組合實作為
f . g = \x -> f (g x)函式應用程式是左關聯的
型別簽名中的箭頭是右結合的
寫出來 (twice . twice) plusTwo 3
運算式可以顯式括起來為
((twice . twice) plusTwo) 3
可以重寫為
------f-------- -n-
(twice (twice plusTwo)) 3
|
V
------f-------- (------f-------- -n-)
(twice plusTwo) ((twice plusTwo) 3 )
\------------------/
|||
plusTwo (plusTwo 3)
|||
7
\-----------------------------------/
|||
twice plusTwo 7
看似型別簽名不匹配
下面的函陣列合運算子的型別簽名表明它采用單引數函式,
(.) :: (b -> c) -> (a -> b) -> a -> c
f . g = \x -> f (g x)
但twice需要兩個引數(即,(t -> t) -> t -> t),所以這讓我失望。
x我想當回傳的 lambda 的引數本身就是一個函式時,這是唯一可行的方法。會不會這么簡單?
twice . twice
((a -> a) -> a -> a) -> ((a -> a) -> a -> a) -> ?
(---b---- -> --c---) -> (---a---- -> --b---) -> (a -> c)
? = (a -> a) -> a -> a
或者,換句話說,twice . twice采用帶有簽名的函式(a -> a) -> a(a這里是Integer)。
如果上述內容是正確的,那么我可以找出參與函式具有不同輸入引數(例如,twice . ( 2))的函陣列合。
uj5u.com熱心網友回復:
是的,這就是全部。twice如果您寫as的簽名,可能會更容易思考
twice :: (Integer -> Integer) -> (Integer -> Integer)
如您所知,這與currying 是等價的。這樣看來twice,它是一個論點的函式,并且將它與twiceagain 組合起來似乎是完全明智的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/411543.html
標籤:
上一篇:C 奇數匯編輸出查詢
下一篇:決議執行塊中的錯誤
