我可以验证给定的函数类型签名是否具有潜在的实现?

时间:2018-02-13 18:10:37

标签: haskell polymorphism parametric-polymorphism hindley-milner

在显式类型注释的情况下,Haskell检查推断类型是否至少与其签名一样多态,或者换句话说,推断类型是否是显式类型的子类型。因此,以下函数是错误的类型:

foo :: a -> b
foo x = x

bar :: (a -> b) -> a -> c
bar f x = f x

然而,在我的场景中,我只有一个功能签名,需要验证,是否有人居住"通过潜在的实施 - 希望这个解释完全有意义!

由于参数性属性,我假设foobar都没有实现,因此,两者都应该被拒绝。但我不知道如何以编程方式结束这一点。

目标是整理所有或至少一部分无效类型签名,如上所述。我很感激每一个提示。

2 个答案:

答案 0 :(得分:8)

  

目标是整理所有或至少一部分无效类型签名,如上所述。我很感激每一个提示。

您可能需要查看Curry-Howard correspondence

基本上,功能程序中的类型对应于逻辑公式。 只需将->替换为含义,将(,)替换为带(AND),将Either替换为析取(OR)。有人居住的类型正是具有相应公式的那些,这是直觉主义逻辑中的重言式。

有些算法可以决定直觉逻辑中的可证明性(例如在Gentzen的序列中利用切割消除),但问题是PSPACE完全,所以通常我们不能使用非常大的类型。但是,对于中型类型,切割消除算法工作正常。

如果你只想要一个无人居住类型的子集,你可以限制那些具有相应公式的那些不是古典逻辑中的重言式。这是正确的,因为直觉主义的重言式也是经典的。检查公式P是否不是经典的重言式可以通过询问not P是否是可满足的公式来完成。所以,问题在于NP。不多,但比PSPACE-complete更好。

例如,上述两种类型

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

显然不是重言式!因此他们没有人居住。

最后,请注意,对于任何类型undefined :: T,在Haskell let x = x in x :: TT中,所以从技术上讲,每种类型都有人居住。一旦限制终止没有运行时错误的程序,我们就会得到一个更有意义的概念"有人居住的",这是由Curry-Howard通信解决的问题。

答案 1 :(得分:7)

不幸的是,

Here's a recent implementation of that as a GHC plugin目前需要GHC HEAD。

它由一个带有单个方法的类型类

组成
class JustDoIt a where
  justDoIt :: a

当插件可以找到其推断类型的居民时,justDoIt类型检查。

foo :: (r -> Either e a) -> (a -> (r -> Either e b)) -> (r -> Either e (a,b))
foo = justDoIt

有关更多信息,请阅读Joachim Breitner的blogpost,其中还提到了一些其他选项:djinn(已在此处的其他评论中),exferencecurryhoward用于Scala ,hezarfen为伊德里斯。