首页 > 解决方案 > 函数类型的类型列表

问题描述

我想做一个给定函数类型(例如String -> Nat -> Bool)的函数,它将返回与该函数类型(例如)对应的类型列表[String, Nat, Bool]。大概这样一个函数的签名是Type -> List Type,但我正在努力确定它是如何实现的。

标签: idris

解决方案


我不相信它通常可以完成,因为你不能在功能上进行模式匹配。你也不能检查函数的类型。这不是依赖类型的意义所在。就像在 Haskell 或 OCaml 中一样,您实际上可以对函数做的唯一事情就是将其应用于某个参数。但是,我设计了一些可能会做的技巧:

myFun : {a, b : Type} -> (a -> b) -> List Type
myFun {a} {b} _ = [a, b]

现在的问题是,这a -> b是唯一可以匹配任意函数的签名。但是,当然它不会像你想要的那样处理 arity 大于 1 的函数:

> myFun (+)
[Integer, Integer -> Integer] : List Type

因此,需要对自身进行某种递归调用以提取更多参数类型:

myFun : {a, b : Type} -> (a -> b) -> List Type
myFun {a} {b} _ = a :: myFun b

这里的问题是这b是一个任意类型,不一定是函数类型,而且我无法动态检查它是否是函数,所以我想这与 Idris 一样多。

但是,类型的动态检查(至少在我看来)并不是静态类型语言所需要的功能。毕竟静态类型的全部意义在于提前指定函数可以处理什么样的参数,并防止在编译时调用带有无效参数的函数。所以基本上你可能根本不需要它。如果您指定了您的宏伟目标,那么有人可能会向您展示正确的做法。


推荐阅读