繁体   English   中英

您应该如何在Typed Racket中的letrec中键入相互注释的递归函数?

How should you type annotate mutually recursive functions in letrec in Typed Racket?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

如果我正确理解,这是注释Typed Racket中letrec中定义的函数的正确方法:

#lang typed/racket

(letrec ((is-even? (lambda ((n : Nonnegative-Integer))
                     : Boolean
                     (or (zero? n)
                         (is-odd? (sub1 n)))))
         (is-odd? (lambda ((n : Nonnegative-Integer))
                    : Boolean
                    (and (not (zero? n))
                         (is-even? (sub1 n))))))
  (is-odd? 11))

但这给出了错误信息:

Type Checker: insufficient type information to typecheck. please add more
              type annotations in: is-odd?

解决方法是这样的:

(local ((: is-even? : Nonnegative-Integer -> Boolean)
        (define (is-even? n)
          (or (zero? n)
              (is-odd? (sub1 n))))
        (: is-odd? : Nonnegative-Integer -> Boolean)
        (define (is-odd? n)
          (and (not (zero? n))
               (is-even? (sub1 n)))))
  (is-odd? 11))

也可以使用传统表示法的形式,例如该问题,但我希望也能够使用当前表示法对letrec进行注释。

1 个回复

您可以在letrec的函数名称之后添加类型注释,如下所示:

(letrec ([f1 : type1 expr1]
         [f2 : type2 expr2])
  body)

以您的示例为例:

(letrec ([is-even? : (-> Nonnegative-Integer Boolean)
                   (lambda (n)
                     (or (zero? n)
                         (is-odd? (sub1 n))))]
         [is-odd? : (-> Nonnegative-Integer Boolean)
                  (lambda (n)
                    (and (not (zero? n))
                         (is-even? (sub1 n))))])
  (is-odd? 11))

为什么这样做有效,但在lambda内放置类型注释却不能呢?

这是因为确保每个lambda类型检查都依赖于is-odd?类型is-odd? is-even? 分别。 但是,如果您不直接注释函数名,则只能尝试通过对lambda进行类型检查来推断这些类型。

直接注释函数名意味着在知道什么类型is-even?之前,它甚至不必查看lambda is-even? is-odd? 一定有。

1 表示管道的函数列表的类型化球拍类型

我在无类型 Racket 中有一个函数,它接受表示输入的参数、表示管道的函数和符号列表,以及之前停止应用函数的符号(我知道这不是很清楚,但代码在下面)。 我正在尝试将其转换为 Typed Racket,但无法弄清楚如何让类型系统了解发生了什么。 我知道我可以只使用cast来强制其工作,但我不知道是否 ...

2 相互递归函数的Hindley Milner类型推断

我正在制作一种强类型玩具功能编程语言。 它使用Hindley Milner算法作为类型推断算法。 在实现该算法时,我对如何推断相互递归函数的类型有疑问。 f和g是相互递归的函数。 现在,当类型检查器推断函数f的类型时,它也应该能够推断函数g的类型,因为它是子表达式。 但是 ...

3 产品类型上的相互递归函数

(初学者 Coq 问题) 与Defining recursive function over product type 相关,我试图在产品类型上定义递归函数。 这里的区别在于有一个相互递归的定义。 我一直遇到这个错误: printObjItem 的递归定义格式错误。 递归调用 pri ...

5 如何在Haxe中编写相互递归的函数

我试图在Haxe 3中编写一个简单的相互递归函数,但是无法获得编译代码,因为首先出现的相互函数中的任何一个都会报告该组中的其他函数未定义。 下面是一个最小的例子,其中使用odd和even相互定义的函数来确定奇偶校验。 试图将其编译为neko给出: 我试着给的向前声明odd之前e ...

6 如何有效地描述相互递归函数

我正在尝试分析一组相互递归的函数。 最好,我想为每个功能查看相对于其他功能需要多少时间。 但是,由于这些函数是相互递归的,因此定期分析会显示所有函数占用100%的时间。 我想要进行的分析是显示每个函数的包含时间,而不包括它在递归调用上花费的时间。 因此,例如,A呼叫B和C; B再次 ...

7 您如何在Clojure的core.typed中注释多态核心功能?

我想在代码中应用core.type批注,但是遇到了如何/何时实例化多态的核心函数(从函数主体内部调用)的绊脚石。 通过对此进行故障排除,我了解到必须对filter和count进行特殊处理,因为它们分别是多态的和静态的,应在let绑定中提取匿名函数并对其进行注释。 如果有人可以根据以下错误 ...

8 相互递归函数

我试图理解为什么以下函数对于我给它们的任何输入都输出零。 我会认为,基于递归的性质,向函数g输入2会产生12。我似乎对任一函数使用的任何整数都只会输出0。有人能指出我在思考过程中哪里出错了吗? ...

9 如何定义与函数相互递归的归纳类型?

我想定义一个归纳类型Foo ,构造函数接受一些属性作为参数。 我希望这些属性依赖于我当前定义的类型的归纳参数。 我希望能够使用一些递归函数bar从这些属性中收集一些数据,该函数bar将采用Foo类型的对象。 但是,我不知道有什么方法可以声明这两个,以便 Coq 接受它们的定义。 我希望能够写出这样的 ...

10 Coq:在归纳类型上定义两个以上的相互递归函数

我在归纳类型事件上定义了三个相互递归的函数,使用两种不同的方式:使用with和fix关键字,然而,Coq抱怨主要参数和引用...分别在......中找不到 。 这两个函数的两个实现如下: Coq抱怨递归调用round的主参数等于“h”而不是“tl”。 即便如此,在调用圆形 H是E的一 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM