【发布时间】:2020-02-17 22:14:55
【问题描述】:
在 Haskell(和 chicken scheme)中,您可以声明约束类型,
例如map :: (a -> b) -> [a] -> [b] 声明
map 将获取一个包含函数输入类型的列表,并返回一个包含函数输出的列表。
在常见的 lisp 函数声明中是否可能相同?
我可以做类似这样的事情吗:
(declaim (ftype (function (function (a) b)
(list a))
(list b)
map))
“你不能那样做”将是一个令人满意的答案:)
【问题讨论】:
-
您能否使用listp 检查您的参数是否实际上是列表?
-
@BobJarvis-ReinstateMonica 嗯,不知道你的意思。我已经可以知道如何将输入和返回值声明为一个列表,我要做的是指定列表中的类型与函数一致。
-
在来自 Lisp Cookbook 的 this page 中,在“类型检查”下它说“Common Lisp 通过宏
check-type支持运行时类型检查。它接受一个位置和一个类型说明符作为参数如果 place 的内容不是给定类型,则发出类型错误信号”。也许这是一个起点。 -
即使你可以声明它们,你会用它们做什么? Common Lisp 作为标准没有定义任何静态类型检查。人们需要寻找 Common Lisp 的扩展和/或特定的实现,这将提供静态类型检查。