haskell - 类型 (.) 。 (.)

标签 haskell types

如何推断 (.) 的类型。 (.)(b -> c) -> (a -> a1 -> b) -> a -> a1 -> c

(我的想法显然是错误的:(.) 的类型是 (t2->t3) -> (t1->t2) -> t1 -> t3,应该与 (t2->t3) -> [(t1->t2) -> (t1->t3)] 相同(也使用 [ ]{} 以提高可读性)。因此,(.) . (.) 的类型应该类似于 {(b2->b3) -> [(b1->b2) -> (b1->b3)]} -> {(a2->a3) -> [(a1->a2) -> (a1->a3)]} 需要 (b2->b3) 匹配 [(a1->a2) -> (a1->a3)]...

但这永远不会导致所需的类型。

出了什么问题?

最佳答案

表达式 (.) 。 (.) 表示 (.) (.) (.)。要获取其类型,让我们从以下位置开始:

(.) :: (t2 -> t3) -> (t1 -> t2) -> t1 -> t3
(.)    (.)        :: ???

让我们将第二个 (.) 的类型进行 alpha 转换为 (a2 -> a3) -> (a1 -> a2) -> a1 -> a3。这个类型是t2 -> t3,所以我们得到

t2 = a2 -> a3
t3 = (a1 -> a2) -> a1 -> a3

因此,

(.) (.) :: (t1 -> t2) -> t1 -> t3    with the above t2,t3
(.) (.) :: (t1 -> a2 -> a3) -> t1 -> (a1 -> a2) -> a1 -> a3

现在,

(.) (.) :: (t1 -> a2 -> a3) -> t1 -> (a1 -> a2) -> a1 -> a3
(.) (.)    (.)              :: ???

让第三个 (.) 具有类型 (b2 -> b3) -> (b1 -> b2) -> b1 -> b3。 这是t1 -> a2 -> a3,所以我们得到

t1 = b2 -> b3
a2 -> a3 = (b1 -> b2) -> b1 -> b3

因此

t1 = b2 -> b3
a2 = b1 -> b2
a3 = b1 -> b3

结论:

(.) (.) (.) :: t1 -> (a1 -> a2) -> a1 -> a3   with the above t1,a2,a3
(.) (.) (.) :: (b2 -> b3) -> (a1 -> b1 -> b2) -> a1 -> b1 -> b3

这是您期望的类型

               (b  -> c ) -> (a  -> a1 -> b ) -> a  -> a1 -> c

一旦类型变量进行 alpha 转换。

关于haskell - 类型 (.) 。 (.),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29054454/

相关文章:

Haskell 算术运算和任意/固定精度数的 DB 持久性

haskell - 是否建议以尾递归形式使用递归IO操作?

Haskell 类型签名 : Question on type signature of lastButOne Program

c# - 如何在 .NET 中获取 "basic"中的 "container type"类型?

types - 为什么编译器不警告强制转换为枚举?

haskell - 如何为自定义数据类型定义 (+) 函数?

performance - 如何在haskell中严格制作表格(Data.Map)?

haskell - 将流转换器函数转换为 Haskell 中的 Mealy 自动机

ruby-on-rails - Rails month_field 数据类型

php - postgresql 类型错误