如何在键入的racket中指定void函数?

如何在键入的racket中指定void函数?,racket,typed-racket,Racket,Typed Racket,foo的类型注释应该是什么 (define (foo) (println "hello")) 我试过这些,但都不管用: (: foo (-> () ())) (: foo (-> Void Void)) 在这种情况下,类型化的Racket可以推断类型。运行此程序: #lang typed/racket (define (foo) (println "hello")) 然后在REPL中你可以写 > foo - : (-> Void) #<procedur

foo
的类型注释应该是什么

(define (foo)
  (println "hello"))
我试过这些,但都不管用:

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

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

#lang typed/racket
(define (foo)
  (println "hello"))
然后在REPL中你可以写

> foo
- : (-> Void)
#<procedure:foo>
查看foo的类型是否为
(>Void)
。 也就是说,它是一个无参数函数,返回类型为
Void
(即返回
#
)的值

我们的最终计划是:

#lang typed/racket
(: foo : (-> Void))
(define (foo)
   (println "hello"))
类型
(>Void Void)
用于接受
Void
并返回
Void
的函数。您的
foo
函数不接受任何参数,并返回
Void
。因此,您想要的函数类型实际上是:

(: foo (-> Void))
(define (foo)
  (println "hello"))
作为旁注:

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

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

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

这在语法上是无效的。

不接受任何内容的函数和接受“void”的函数有什么区别?我认为这两者只是同义词。与Java或C等语言不同,void是Racket中的一个实际值。它是一个单例,因为只有一个值,所以返回它几乎没有什么用处。因为每个函数都需要返回“某物”,所以当我们不想返回很多东西时,我们使用void。Haskell的
单元
类似。这是为什么一个函数接受了一个
Void
却接受了一个只有Void才能满足的参数。明白了。谢谢!
(: foo (-> () ()))