在显式类型注释的情况下,Haskell检查推断类型是否至少与其签名一样多态,或者换句话说,推断类型是否是显式类型的子类型。因此,以下函数是错误的类型:
foo :: a -> b
foo x = x
bar :: (a -> b) -> a -> c
bar f x = f x
然而,在我的场景中,我只有一个功能签名,需要验证,是否有人居住"通过潜在的实施 - 希望这个解释完全有意义!
由于参数性属性,我假设foo
和bar
都没有实现,因此,两者都应该被拒绝。但我不知道如何以编程方式结束这一点。
目标是整理所有或至少一部分无效类型签名,如上所述。我很感激每一个提示。
答案 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 :: T
和T
中,所以从技术上讲,每种类型都有人居住。一旦限制终止没有运行时错误的程序,我们就会得到一个更有意义的概念"有人居住的",这是由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(已在此处的其他评论中),exference,curryhoward用于Scala ,hezarfen为伊德里斯。