在case语句中缺少标识符的类型

时间:2017-04-04 18:15:36

标签: scheme racket typed-racket

我正在尝试学习打字球拍,而且我遇到了某些类型的注释问题。

#lang typed/racket
(require typed/racket/gui)

(define frame (new frame% [label "test frame"]))



(define tab-panel (new tab-panel% [parent frame] [choices '("One" "Two" "Three")]
                       [min-height 300] [min-width 300]
                       (callback
                               (lambda (tp e)
                                (case (send tp get-selection)
                                 ((0) (send tp change-children (lambda (children) (list a-panel))))
                                 ((1) (send tp change-children (lambda (children) (list b-panel))))
                                 ((2) (send tp change-children (lambda (children) (list c-panel)))))))))

(define a-panel (new panel% (parent tab-panel)))
(define a-text (new message% (parent a-panel) (label "A-panel")))
(define b-panel (new panel% (parent tab-panel)))
(define b-text (new message% (parent b-panel) (label "B-panel")))
(define c-panel (new panel% (parent tab-panel)))
(define c-text (new message% (parent c-panel) (label "C-panel")))

在case语句中的行上生成以下错误:

. Type Checker: missing type for identifier;
 consider adding a type annotation with `:'
  identifier: a-panel in: a-panel
. Type Checker: missing type for identifier;
 consider adding a type annotation with `:'
  identifier: b-panel in: b-panel
. Type Checker: missing type for identifier;
 consider adding a type annotation with `:'
  identifier: c-panel in: c-panel
. Type Checker: Summary: 3 errors encountered in:
  a-panel
  b-panel
  c-panel

我一直在挖掘文档,我似乎无法弄清楚类型声明的正确语法来解决这个问题。

这不是作业。我只是想学习打字球拍,因为我认为强打字是一个好主意。

1 个答案:

答案 0 :(得分:2)

您的case语句和GUI内容会混淆问题。有时通过尝试较小的例子可以更容易地弄清楚错误是什么。这个问题与这个更简单的程序中的问题相同:

#lang typed/racket

(define (list-abc)
  (list a b c))

(define a 1)
(define b 2)
(define c 3)

必须知道abc的类型才能推断出list-abc的类型。有两种方法可以解决这个问题。在list-abc上添加类型注释,或在abc上添加类型注释。

或者:

(: list-abc : -> (Listof Integer))
(define (list-abc)
  (list a b c))

或者:

(define a : Integer 1)
(define b : Integer 2)
(define c : Integer 3)

这个更简单问题的解决方案也可以转换为更大的程序。您可以使用tab-panel上的类型注释或a-panelb-panelc-panel上的类型注释来解决此问题。

对于您的计划,注释不会是(-> (Listof Integer))Integer,它们将是(Instance Tab-Panel%)(Instance Panel%)