繁体   English   中英

在 Haskell 中查找组合 function 的类型

[英]Finding the type of a composition function in Haskell

假设我在 Haskell 中有以下 function:

compose2 = (.). (.)

我将如何 go 找到这个 function 的类型? 由于有多种组合,我试图确定这个 function 的类型是什么。

我知道我可以使用:t compose2来获取类型。 但是,我想知道如何在没有计算机帮助的情况下做到这一点。 我应该采取哪些步骤来查找类型?

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

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

这样更容易参考一些 function。 我们还可以将其转换为更规范的形式,例如:

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

所以现在我们可以开始推导 function 类型。 我们知道(.)的类型为(.):: (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的 function 应用程序的参数,因此这意味着参数的类型(b -> c)与类型(e -> f) -> ((d -> e) -> (d -> f)) ,因此b ~ (e -> f)c ~ ((d -> e) -> (d -> f))

我们进一步知道(.) 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))

我们知道b等价于b ~ (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

如果我们因此用h替换b ,用i替换c ,用d替换a1a g替换 a ,我们得到相同的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM