我可以验证给定的函数类型签名是否具有潜在的实现吗?
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" 潜在的实现 - 希望这个解释完全有意义!
由于参数化 属性 我假设 foo
和 bar
都没有实现,因此,两者都应该被拒绝。但我不知道如何以编程方式结束这个。
目标是整理出所有或至少一部分无效类型签名,如上面的那些。我很感激每一个提示。
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 :: T
和 let x = x in x :: T
中对于任何类型 T
,因此从技术上讲,每种类型都有人居住。一旦限制为终止 没有运行时错误的程序,我们就会得到更有意义的 "inhabited" 概念,这就是 Curry-Howard 通信所解决的问题。
在显式类型注释的情况下 Haskell 检查推断类型是否至少与其签名一样多态,或者换句话说,推断类型是否是显式类型的子类型。因此,以下函数类型错误:
foo :: a -> b
foo x = x
bar :: (a -> b) -> a -> c
bar f x = f x
然而,在我的场景中,我只有一个函数签名并且需要验证它是否是 "inhabited" 潜在的实现 - 希望这个解释完全有意义!
由于参数化 属性 我假设 foo
和 bar
都没有实现,因此,两者都应该被拒绝。但我不知道如何以编程方式结束这个。
目标是整理出所有或至少一部分无效类型签名,如上面的那些。我很感激每一个提示。
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 :: T
和 let x = x in x :: T
中对于任何类型 T
,因此从技术上讲,每种类型都有人居住。一旦限制为终止 没有运行时错误的程序,我们就会得到更有意义的 "inhabited" 概念,这就是 Curry-Howard 通信所解决的问题。