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

Can I verify whether a given function type signature has a potential implementation?

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

foo :: a -> b
foo x = x

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

然而,在我的场景中,我只有一个函数签名并且需要验证它是否是 "inhabited" 潜在的实现 - 希望这个解释完全有意义!

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

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

Here's a recent implementation of that as a GHC plugin 不幸的是,目前需要 GHC HEAD。


它由一个类型 class 和一个方法组成

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, which also mentions a few other options: djinn (already in other comments here), exference, curryhoward for Scala, hezarfen for Idris。

Goal is to sort out all or at least a subset of invalid type signatures like ones above. I am grateful for every hint.

您可能想看看 Curry-Howard correspondence

基本上,函数式程序中的类型对应于逻辑公式。 只需将 -> 替换为蕴含,将 (,) 替换为合取 (AND),将 Either 替换为析取 (OR)。居住类型正是那些具有相应公式的类型,该公式是直觉逻辑中的重言式。

有些算法可以决定直觉逻辑中的可证明性(例如,利用 Gentzen 的后继式中的割消法),但问题是 PSPACE 完全的,因此通常我们不能处理非常大的类型。但是,对于中等大小的类型,切割消除算法工作正常。

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

比如以上两种

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

显然不是同义反复!因此他们无人居住。

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