我想要一个函数来确定一个类型是否是一个函数类型,如下所示:
isFunction : Type -> Bool
isFunction (a -> b) = True
isFunction _ = False
但是,这会为所有输入返回True
。我怎样才能做到这一点?
答案 0 :(得分:8)
匹配类型称为 type-casing 。能够做到这一点会打破一个名为 parametricity 的概念,这是非常有价值的。
https://stackoverflow.com/a/23224110/108359
Idris不支持类型套管。我认为它可能在一个阶段尝试过,但人们很快放弃了。它还用于在尝试使用类型套管时出错,但检查导致了错误,因此现在已被禁用。
虽然您不再出现错误,但您无法提供Type -> Bool
的实施方式,该方式与const True
或const False
的工作方式不同。
很抱歉,这个功能是不可能的。这可能听起来像一个限制,但每当我认为我有一个与此类似的功能的动机时,我最终发现我可以用更明确的方式构建我的程序。
答案 1 :(得分:1)
这里的问题是:你为什么需要这样的东西?
您是否需要查明任何Idris类型是否为函数?或者您只是需要从Idris类型的特定子集中找到它? 我无法确定第一个应用程序的可能应用程序,但如果它是您需要的第二个应用程序,那么您可以定义自己的嵌入式语言来处理这些类型的值,如下所示:
data Ty = TyNat | TyString | TyFun Ty Ty | ...
isFunction : Ty -> Bool
isFunction (TyFun _ _) = True
isFunction _ = False
查看此演讲,了解有关如何实现这些嵌入式语言的更多信息: https://vimeo.com/61663317