【问题标题】:How to check type in Racket?如何检查球拍中的类型?
【发布时间】: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/cnumber?integer?。那么你能澄清一下你真正想要什么,以及为什么像generic-set? 这样的谓词还不够吗?
  • Python & Haskell 在这方面完全不同; Haskell 有一个静态类型系统,Python 没有。对这两个词使用同一个词(“类型”)可能不是一个好主意。我相对确信你不能在 Haskell 中编写一个接受任意值并返回其类型的函数。除其他外,我声称这绝对会破坏参数化。
  • 在 Haskell 中:typeOf :: ∀ a. (Typeable a) => a -> TypeRep,尽管您是对的,Typeable a 不允许任意类型,并且由于这种参数化并没有说明太多。我想参数化会像∀ a. (a -> TypeRep) -> a -> TypeRep一样说明这一点

标签: types racket


【解决方案1】:

#lang racket 是动态类型的。实际上,这意味着您通常不(不应该)关心某些值的“The”“Type”。

相反(正如亚历克斯指出的那样),您为 list? 之类的“谓词”函数赋值。如果谓词返回 true,那么您可以继续使用该值对 list-y 执行操作——将值赋予期望 list 的函数。

这比(typeof value) 之类的返回List 之类的魔术符号更有用和可靠。毕竟,你关心的是你可以用价值做什么。谓词告诉你。谓词允许以多种方式使用的值(例如,作为列表和作为集合,两者都有)。


附言这类似于为什么版本号(如语义版本控制)如此愚蠢。给定一些已安装的库,您真正关心的是,它是否提供某些功能和行为。你想问实际安装的库,你是否提供了函数X——而不是使用一些幻数和外部信息来猜测。


p.p.s.如果您想序列化值(将它们写入和读取到文件)怎么办?您确实需要选择一种表示每个值的方式。在 Racket 中,一种方法是使用原始值的打印表示,以及其他类似预制结构的东西——然后使用writeread。还有racket/serialize。无论如何,序列化值是一件相对罕见的事情。

【讨论】:

  • 我想检查开发类型的情况如何?例如,我收到此错误:“cadr:预期违反合同:(cons/c any/c 对?)给定:'A2” 现在我认为'A2 可以用“符号”检查?但如果我不知道呢?
  • "给定一些已安装的库,您真正关心的是,它是否提供某些功能和行为" 实际上不仅如此。您还关心该功能的 API。所以,如果函数名改变了,就会出现编译错误
  • @Akangka 1. 我写了“和行为”。 2. 你正在对一个 18 个月大的答案进行试错。相反,如果您觉得它不能很好地解决问题,为什么不写并提交您自己的答案。
猜你喜欢
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 2021-07-30
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多