haskell - 是什么让 Haskell 中的两个类型表达式等效?

标签 haskell types equivalence

所以有人问我这 3 种类型表达式在 Haskell 中是否等效:

τ1 = (a -> a) -> (a -> a -> a)
τ2 = a -> a -> ((a -> a) -> a)
τ3 = a -> a -> (a -> (a -> a))

如果我去掉括号,我就剩下这个

τ1 = (a -> a) -> a -> a -> a
τ2 = a -> a -> (a -> a) -> a
τ3 = a -> a -> a -> a -> a

所以对我来说很明显它们彼此不同。然而,根据问题,这两个答案都是错误的:

τ1 !≡ τ2 !≡ τ3 !≡ τ1
τ1 !≡ τ2 ≡ τ3

所以我在这里有点困惑,正确的答案是什么以及为什么?

最佳答案

事实上,由于您提到的原因,它们都是不同的。

我们甚至可以要求 GHC 确认。 (下面,我选择了a ~ Int来获取封闭类型。)

> import Data.Type.Equality
> type T1 a = (a -> a) -> (a -> a -> a)
> type T2 a = a -> a -> ((a -> a) -> a)
> type T3 a = a -> a -> (a -> (a -> a))
> :kind! T1 Int == T2 Int
T1 Int == T2 Int :: Bool
= 'False
> :kind! T1 Int == T3 Int
T1 Int == T3 Int :: Bool
= 'False
> :kind! T2 Int == T3 Int
T2 Int == T3 Int :: Bool
= 'False

关于haskell - 是什么让 Haskell 中的两个类型表达式等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53160080/

相关文章:

fortran - 从 Fortran 77 代码(公共(public) block 和等价的组合)转移到 Fortran 90

haskell - LiftM (:[]) work

haskell - 为什么 `Bits` 依赖于 `Num` ?

haskell - 打字判断有种类吗?

用于存储 double 或 long 或任何其他数据的 C 数据类型

css - 带有前置零的 "unit-relevant"CSS 属性值是否等同于相应的 "no-zeroes-prepended"值?

postgresql - 我在 Yesod、Auth-HashDB 和 PostgreSQL 上的网络应用程序拒绝编译——无法将类型 ‘AuthEntity App’ 与 ‘User’ 匹配

Haskell Int 和 Maybe Int

swift - 为什么 type(of :) return Metatype, 而不是 T.Type?

python - c++中python "type(<name>, <bases>, <dict>)"的等价物是什么?