【发布时间】:2019-04-16 22:35:59
【问题描述】:
我定义了一个函数
(define 1-9 (list->set (range 1 10)))
我想看看1-9是否真的是一个集合。如何获取1-9的类型?
我尝试谷歌球拍检查类型,但找不到任何有用的信息。
【问题讨论】:
-
generic-set?。如(generic-set? 1-9) = #true -
所以你必须知道之前的类型?如果我不知道输出的类型怎么办?
-
如果您想查看它是否是一组,请使用
generic-set?。如果您想查看它是否是一个列表,请使用list?。如果您想查看它是否为数字,请使用number?。然而,在 Racket 中,类型可以重叠,所以某些东西可以同时是generic-set?和list?,这很好,就像可以同时成为number?和integer?一样。任何值都有“类型”any/c,因为无论x是什么,(any/c x)都是真的。5至少有三个“类型”any/c、number?和integer?。那么你能澄清一下你真正想要什么,以及为什么像generic-set?这样的谓词还不够吗? -
Python & Haskell 在这方面完全不同; Haskell 有一个静态类型系统,Python 没有。对这两个词使用同一个词(“类型”)可能不是一个好主意。我相对确信你不能在 Haskell 中编写一个接受任意值并返回其类型的函数。除其他外,我声称这绝对会破坏参数化。
-
在 Haskell 中:
typeOf :: ∀ a. (Typeable a) => a -> TypeRep,尽管您是对的,Typeable a不允许任意类型,并且由于这种参数化并没有说明太多。我想参数化会像∀ a. (a -> TypeRep) -> a -> TypeRep一样说明这一点