我试图了解如何在Typed Racket中使用for*/first
循环。因为每次我尝试执行我的代码时都会遇到异常,我需要添加更多注释。
我有以下for*/first
循环:
(for*/first ([current-pos : Integer (in-range start-pos -1 -1)]
#:when (char=? (string-ref input-string current-pos) character))
current-pos)
如果我理解official typed racket reference权限,for*/first
- 循环中的类型注释是完全可选的,但循环中使用的值必须都来自同一类型。
我现在检查了seq-expr in-range
的类型,它是一个整数序列(Sequenceof Integer)
,current-pos
注释为{{ 1}},所以每个值都是事实上的整数。在引用中还提到Integer
必须是最后一个for子句(与我的代码片段完全相同)。
然而,每次执行代码时,我都会收到错误消息:
类型检查器:宏扩展错误 - 类型信息不足以进行类型检查。请添加更多类型注释:(对于* / first((current-pos:Integer(范围内起始位置-1 -1))#:when(char =?(string-ref input-string current-pos) character))current-pos)
所以我的问题:如何使用正确的注释在类型球拍中编写for * / first循环?
在stackoverflow上也有一个类似的问题,但解决方案只是在他们添加使用重载#:when
而不是for*/first
函数的可能性之前是最新的。但是,由于“你需要一个50点评论政策的声誉”,我不可能对这些问题发表评论。
我在REPL中进行了一些实验,问题必须在于for*/first:
- 循环的返回值。我现在已将for*/first
- 循环转换为for*/first
循环并在结果上应用了for/list
,这有点棘手,但至少它有效。