如何在键入的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 (-> () ()))