[英]What is the type of this haskell double function composition?
t2 = (\\xy z-> xyx)
GHCI 向我展示了這個:
t2 :: (b1 -> b2) -> (b2 -> b1) -> p -> b1 -> b2
我不太明白這種類型簽名是如何產生的。 到目前為止,我認為最右邊的 x 基本上是一個函數,它接受一個b2
並返回一個b1
,那么b1
是中間函數y
的輸入,並再次輸出b2
? 它不應該返回一個新類型b3
或什么的值嗎?
首先讓我們以一種明確哪個參數對應於類型簽名的哪個部分的方式重寫它:
t2 :: (b1->b2) -> (b2->b1) -> p -> b1 -> b2
t2 x y z = x . y . x
z :: p
根本沒有使用,所以我們可以很容易地通過考慮來消除它
t3 :: (b1->b2) -> (b2->b1) -> b1 -> b2
t3 x y = x . y . x
為什么是那種類型? 那么,該組合物鏈饋送的結果x
成y
,和的結果y
回x
。 換句話說, y
讓你從結果類型的x
回到參數類型的x
。 因此y
的類型必須是x
的“倒置”類型。 所以
t3 :: (m->n) -> (n->m) -> ?
t3 x y = x . y . x
組合的類型由“外端”決定,即參數必須是x
的參數類型,結果必須是...的結果類型,再次, x
。 因此
t3 :: (m->n) -> (n->m) -> m->n
t3 x y = x.y.x
這就是 GHCi 告訴你的,帶有重命名的類型變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.