Warm tip: This article is reproduced from serverfault.com, please click

其他-在Haskell中查找合成函数的类型

(其他 - Finding the type of a composition function in Haskell)

发布于 2020-11-28 14:10:15

假设我在Haskell中具有以下功能:

compose2 = (.) . (.)

我将如何查找此函数的类型?由于存在多个组成部分,因此我难以确定该函数的类型。

我知道我可以:t compose2用来获取类型。但是,我想知道如何在没有计算机帮助的情况下进行操作。我应该采取什么步骤来找到类型?

Questioner
Miles Cox
Viewed
0
Willem Van Onsem 2020-11-28 22:27:03

如果我们首先为合成函数赋予一个更唯一的标识符,可能会有所帮助,例如:

compose2 = (.)2 .1 (.)3

这样,更容易引用某些功能。我们还可以将其转换为更规范的形式,例如:

compose2 = ((.)1 (.)2) (.)3

所以现在我们可以开始推导函数类型了。我们知道(.)具有类型(.) :: (b -> c) -> (a -> b) -> a -> c,或更规范(.) :: (b -> c) -> ((a -> b) -> (a -> c))由于类型变量不是“全局”的,因此我们可以为树函数赋予类型变量不同的名称:

(.)1 :: (b -> c) -> ((a -> b) -> (a -> c))
(.)2 :: (e -> f) -> ((d -> e) -> (d -> f))
(.)3 :: (h -> i) -> ((g -> h) -> (g -> i))

因此,既然我们已经为不同的组合函数赋予了签名,那么我们就可以开始推导类型了。

我们知道这是带有的函数应用程序的参数,因此这意味着参数的类型类型相同,因此与和相同(.)2(.)1(b -> c)(e -> f) -> ((d -> e) -> (d -> f))b ~ (e -> f)c ~ ((d -> e) -> (d -> f))

我们furtermore知道的“第二”参数的类型相同的类型,所以,因此,和,因此“回归型”的,这是因此可以专门用于:(.)1(.)3(a -> b) ~ ((h -> i) -> ((g -> h) -> (g -> i)))a ~ (h -> i)b ~ ((g -> h) -> (g -> i))(.)1(a -> c)

((.)1 (.)2) (.)3 :: a -> c

并且由于a ~ (h -> i),和c ~ (d -> e) -> (d -> f)

((.)1 (.)2) (.)3 :: (h -> i) -> ((d -> > e) -> (d > f))

我们知道bb ~ (e -> f)与和等效b ~ ((g -> h) -> (g -> i)),因此意味着e ~ (g -> h)f ~ (g -> i),我们可以进一步将签名专门化为:

((.)1 (.)2) (.)3 :: (h -> i) -> ((d -> (g -> h)) -> (d -> (g -> i)))

这是以下更为冗长的形式:

(.)2 .1 (.)3 :: (h -> i) -> (d -> g -> h) -> d -> g -> i

如果我们自动派生类型,我们将获得:

Prelude> :t (.) . (.)
(.) . (.) :: (b -> c) -> (a1 -> a -> b) -> a1 -> a -> c

如果我们这样替换bhcia1dag,我们得到了相同的类型。