我试图手动在Haskell中找到(.).(.)的类型。

我的尝试如下:

(.).(.) = \x -> (.).(.) x

(.)     :: (     b   ->             c         )  ->  ((     a    ->           b        ) -> (a -> c))
(.)     :: (d -> e)  ->  ((f -> d) -> (g -> e))
(.)     ::                                              (h -> i) -> (j -> h) -> (h -> k)

-----------------------------------------------------------------------------------------------------
b ~ (d -> e) ~ (j -> h) -> (h -> k)
c ~ ((f -> d) -> (g -> e))
a ~ (h -> i)
d ~ h
e ~ i

so (a->c)~     (h->i) -> ((f -> h) -> (g -> i))


我的思维方式有什么问题?实际类型是

(.).(.) :: (b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c

最佳答案

让我们看看等效的(.) (.) (.)

第一个点类型:
(b -> c) -> (a -> b) -> a -> c

第二:
(e -> f) -> (d -> e) -> d -> f

因此:

be -> f相同

c(d -> e) -> d -> f相同

第三:
(h -> i) -> (g -> h) -> g -> i

因此:

ah -> i相同

b(g -> h) -> g -> i相同

e -> f(g -> h) -> g -> i

eg -> h

fg -> i

由于第一个点类型的(.) (.) (.) :: a -> c,我们有:

a -> c(h -> i) -> (d -> e) -> d -> f

替换ef
(h -> i) -> (d -> g -> h) -> d -> g -> I

回答您的问题,我认为您的想法有问题,是最后两行,例如:

d ~ h
e ~ i

09-28 10:50