【问题标题】:can not use list functions on an input var - racket不能在输入变量上使用列表函数 - 球拍
【发布时间】:2018-09-13 21:29:25
【问题描述】:

在构建了一个完整的函数之后,我遇到了很多问题,现在我将它分解成小部分。

我的函数有两个变量,一个是一个列表,另一个是一对。使用 (first var1) 时出现错误。

代码如下:

#lang pl

    (define (maxMin list maxiMini)
      (if (null? maxiMini)
          (first list)
          2
      )
    )

这是错误:

类型检查器:多态函数 `first' 无法应用于 论据:

域:(一个列表)

        (Pairof a (Listof b)) 

参数:任意

在:(第一个列表)

在这个 youtube 教程的第 1 分钟和第 10 秒时,教授使用第一个函数的方式与我相同,并且确实在那里工作。

我的猜测是 Racket 不将 myList 识别为列表并将其设置为“任何”这可能吗?

【问题讨论】:

  • 虽然您没有为您的问题提供足够的信息和适当的最小示例,但我猜您的代码与 Racket 的list 存在名称冲突。只需将函数定义中的list 变量重命名为lstlist$。看看问题是否解决了。
  • @AlQuemist 嘿,我实际上尝试过这个并将其命名为 MyList。关于数据量不足,我把我的整个代码。我还能提供什么帮助?我唯一遗漏的部分是子语言。
  • 能否请您添加一个简单的函数用例?我无法弄清楚maxMini 的类型。是list 还是pair?如果它是一个pair,那么你为什么要应用null?呢?我们不能在 Racket 中创建一个空的pair;参见例如Guide
  • 嗨,首先,感谢您抽出宝贵时间,@assefamaru 回答了,但您也帮助了我!是的,我没有给出用例的上下文,因为这是一个较大程序的一小部分。另外,我检查了它是否为空,因为我不知道它不可能,所以谢谢你教我这个!
  • 也许,对于这样的练习,人们应该简单地使用#lang racket,而不是 Typed Racket;你为什么使用 Typed Racket?

标签: list racket


【解决方案1】:

由于您遇到类型检查器错误,我假设您使用的是#lang typed/racket,或者它的一些变体。

如果您仔细查看错误本身,它会告诉您first 是一个多态 函数,这意味着它可以应用于不同类型的参数。此外,该错误还说明了函数first 在“域:”下期望的不同类型,即。它的参数应该是(Listof a)(Pairof a (Listof b))

问题是,您实际上并没有为函数maxMin 定义类型。如果省略类型注释,则推断的类型通常是Any。因此,您的函数不会进行类型检查,因为 first 不期望 Any 类型,这就是它所得到的。

既然你说了

我的函数有两个变量,一个是列表,另一个是一对

为您的函数考虑以下类型注释:

(: max-min (-> (Listof Any) (U Null (Pairof Any Any)) Any))
(define (max-min lst maxi-mini)
  (if (null? maxi-mini)
      (first lst)
      2))

它将进行类型检查,您可以拥有:

(max-min '(1 2 3) '())
=> 1

【讨论】:

  • 嗨,你能解释一下这部分吗:“...(U Null (Pairof Any Any)) Any))”
  • U 是类型的联合。如果参数的类型为(U a b c),则其值只能是a、b 或c 类型之一。因此,在上述情况下,类型将 maxi-mini 限制为 null 或一对。
  • 但请注意,#lang pl 有一个更多的 restricted cons,它只会创建“正确的列表”。因此,更适合您的函数的类型可能是(: max-min (-> (Listof Any) (Listof Any) Any))。如果您知道您只会处理数字,则可以使类型更加具体:(: max-min (-> (Listof Number) (Listof Number) Number))
  • 非常感谢!你真的帮了我!最后一个问题:为什么最后要写extran Number (-> (Listof Number) (Listof Number) ??Number??))
  • 最后一个Number 是函数结果的类型。您可以将其重写为:(: max-min : (Listof Number) (Listof Number) -> Number)。快速阅读here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2017-09-23
  • 2015-03-20
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
相关资源
最近更新 更多