Haskell 类型系统 (*) 的有趣特性之一是,有时您可以仅根据其类型签名准确地判断函数的作用(假设没有涉及unsafe IO
黑魔法)。
例如,任何具有类型签名a -> a
的函数都必须是恒等函数,任何类型的函数(a,b) -> a
都等价于fst
. 在某些情况下,您无法完全确定函数:类型有无数种不同的可能函数a -> Int
,但它们都是常量——它们都忽略了第一个参数。
我觉得这个属性很吸引人,但我怀疑它只适用于“微不足道”的函数,例如id
and const
。我对么?
此外,我在这里的推理仅基于直觉 - 例如,在 中a -> a
,我们“一无所知” a
(与像 等受约束的函数相反Num a => a -> a
),因此除了原样返回之外,“不能做任何事情”。有没有正式的方法来处理这些扣除?
* 我知道 Haskell 的类型系统是基于Hindley-Milner 类型系统的,但我对它还不够熟悉,无法对此做出任何假设