按类型确定函数的效果

时间:2014-05-24 15:40:23

标签: haskell type-theory hindley-milner

Haskell类型系统(*)的一个有趣特性是,有时你可以根据它的类型签名告诉完全该函数的作用(假设有' s)没有unsafe IO黑魔法的爱。)

例如,任何类型为签名a -> a的函数都必须是标识函数,类型(a,b) -> a的任何函数都等同于fst。在某些情况下,您无法完全确定函数:类型a -> Int中存在无数个不同的可能函数,但它们都是常量 - 它们都忽略第一个参数。

我觉得这个属性引人入胜,但我怀疑它只适用于"琐事" idconst等功能。我是对的吗?

此外,我的推理仅基于直觉 - 例如,在a -> a中,我们"什么都不知道"关于a(与Num a => a -> a等约束函数相对)所以"无法做任何事情"除了以不变的方式返回。有没有正式的方法来处理这种扣除?

*我知道Haskell的类型系统是基于 Hindley-Milner类型的系统,但是我不熟悉它就足以承担任何关于它的事情< /子>

1 个答案:

答案 0 :(得分:10)

您所指的概念称为parametricity。对类型的通用量化给出了参数多态性和均匀性#34;直觉上这个概念的财产“我们不知道任何关于&#34; a forall a. a -> a中的f :: [a] -> [a]因此&#34;无法做任何事情&#34;除了它以外,不改变它。均匀性属性所说的是a类型不依赖于[a]的类型,或者更准确地说,依赖于统一:任何一个&#34 ;确实&#34;到a必须是'#34; doable&#34;对于 {{1}}的所有选项。 Wadler使用它来表明映射列表中的值然后置换列表等同于先置换和映射后。

处理这些直觉的正式方法在例如, Philip Wadler的 Theorems for Free 并涉及类型和关系之间的同构(实际上是部分等价关系的 PER 类别(每个&#39; s) ))表明这种均匀性是该类别中的普遍属性。

参数化的一个有趣结果是,您可以从两种方式开始:从类型到关于该类型的定理,从类型到该类型的居民。 Wadler的自由定理是前者和Djinn的一个例子,一个定理证明者(一种类型的居民是&#34;证据&#34;类型&#34; s&#34;定理&# 34;),是后者的一个例子。