如何在类型化的球拍中指定void函数?

时间:2018-08-12 19:29:23

标签: racket typed-racket

foo的类型注释应该是什么?

(define (foo)
  (println "hello"))

我尝试了这些,但没有一个起作用:

(: foo (-> () ()))
(: foo (-> Void Void))

2 个答案:

答案 0 :(得分:3)

在这种情况下,Typed Racket可以推断出类型。运行此程序:

#lang typed/racket
(define (foo)
  (println "hello"))

然后在REPL中可以编写

> foo
- : (-> Void)
#<procedure:foo>

> (:print-type foo)
(-> Void)

查看foo的类型为(-> Void)。 也就是说,它是没有参数的函数,它返回类型为Void的值(即,它返回#<void>

最终程序变为:

#lang typed/racket
(: foo : (-> Void))
(define (foo)
   (println "hello"))

答案 1 :(得分:3)

类型(-> Void Void)用于接受void并返回void的函数。您的foo函数,不接受任何参数,并返回一个void。因此,您想要的类型实际上是:

(: foo (-> Void))
(define (foo)
  (println "hello"))

作为旁注:

如果您想将foo修改为类型(-> Void Void),则可以执行以下操作:

(define (foo _)
  (print "Don't do this though"))

至:

(: foo (-> () ()))

这在语法上是无效的。