答案是:
(a -> b) -> (c -> d -> a) -> c -> d -> b
但我不知道如何到達那里。
uj5u.com熱心網友回復:
(.)有型別(b -> c) -> ((a -> b) -> (a -> c))。為了清楚起見,我特意添加了一些括號。(.)運算式中有三個實體,(.) . (.)因此使用不同字母的三個版本的型別會很方便。
(.) :: (b -> c) -> ((a -> b) -> (a -> c))– 第一個實體(.):(.).(.)(.) :: (e -> f) -> ((d -> e) -> (d -> f))– 的第二個實體(.):(.). (.)(.) :: (h -> i) -> ((g -> h) -> (g -> i))– 的第三個實體(.):(.) .(.)
(.) . (.)相當于((.) (.)) (.),它應用(.)到(.)然后應用第一個應用程式的結果到(.)。
一審適用于二審
將引數 ( (e -> f) -> ((d -> e) -> (d -> f))) 的型別與(.)( b -> c)的輸入型別匹配:
b = (e -> f)
c = ((d -> e) -> (d -> f))
然后將(.)( (a -> b) -> (a -> c))的結果型別中的型別變數替換為引數中的匹配項:
(.) (.) :: (a -> (e -> f)) -> (a -> ((d -> e) -> (d -> f)))
將第一次申請的結果應用到第三次
將引數 ( (h -> i) -> ((g -> h) -> (g -> i))) 的型別與(.) (.)( a -> (e -> f))的輸入型別匹配:
a = (h -> i)
e = (g -> h)
f = (g -> i)
然后將(.) (.)( a -> ((d -> e) -> (d -> f)))的結果型別中的型別變數替換為引數中的匹配項:
(.) (.) (.) :: (h -> i) -> ((d -> (g -> h)) -> (d -> (g -> i)))
這與您在問題中的型別相同,只是有更多的括號和不同的字母。如果我洗掉不必要的括號,結果如下:
(.) (.) (.) :: (h -> i) -> (d -> g -> h) -> d -> g -> i
它有什么作用?它接受兩個型別為dand 的引數,將型別g函式應用于d -> g -> h它們,然后將型別函式應用于h -> i結果。
uj5u.com熱心網友回復:
型別(.) :: (b->c) -> (a->b) -> (a->c)意味著
g :: a -> b
f :: d -> c
-------------------- d ~ b
f . g :: a -> c
因此
(.) :: (b->c) -> ((a->b) -> (a->c))
(.) :: ( s -> r ) -> (t->s) -> (t->r)
-------------------------------------------------------------
(.) . (.) :: (b->c) -> (t->s) -> (t->r)
~ (b->c) -> (t->a->b) -> t->a->c
這是有道理的,因為
((.) . (.)) f g x y =
= (.) ((.) f) g x y
= ((f .) . g) x y = (f .) (g x) y
= (f . g x) y = f ( g x y )
因為(.) f g x = (f .) g x = (f . g) x = f (g x)(還有= (. g) f x)。
(f .)被稱為運算子部分(帶有(.)運算子)。這是書寫的便捷快捷方式(.) f。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/355873.html
下一篇:型別級別集的傳遞“子集”類
