测试类型是否是Idris中的函数类型

时间:2014-12-29 19:42:05

标签: dependent-type idris

我想要一个函数来确定一个类型是否是一个函数类型,如下所示:

isFunction : Type -> Bool
isFunction (a -> b) = True
isFunction _ = False

但是,这会为所有输入返回True。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:8)

匹配类型称为 type-casing 。能够做到这一点会打破一个名为 parametricity 的概念,这是非常有价值的。

https://stackoverflow.com/a/23224110/108359

Idris不支持类型套管。我认为它可能在一个阶段尝试过,但人们很快放弃了。它还用于在尝试使用类型套管时出错,但检查导致了错误,因此现在已被禁用。

虽然您不再出现错误,但您无法提供Type -> Bool的实施方式,该方式与const Trueconst False的工作方式不同。

很抱歉,这个功能是不可能的。这可能听起来像一个限制,但每当我认为我有一个与此类似的功能的动机时,我最终发现我可以用更明确的方式构建我的程序。

答案 1 :(得分:1)

这里的问题是:你为什么需要这样的东西?

您是否需要查明任何Idris类型是否为函数?或者您只是需要从Idris类型的特定子集中找到它? 我无法确定第一个应用程序的可能应用程序,但如果它是您需要的第二个应用程序,那么您可以定义自己的嵌入式语言来处理这些类型的值,如下所示:

data Ty = TyNat | TyString | TyFun Ty Ty | ...

isFunction : Ty -> Bool
isFunction (TyFun _ _) = True
isFunction _ = False

查看此演讲,了解有关如何实现这些嵌入式语言的更多信息: https://vimeo.com/61663317