List cons函数不接受我的输入
好吧,我正试图添加两个元素以成为一个列表,在第4分钟和第53秒,我看到最好的做法是使用“cons” 当我这样做的时候:List cons函数不接受我的输入,list,input,racket,cons,List,Input,Racket,Cons,好吧,我正试图添加两个元素以成为一个列表,在第4分钟和第53秒,我看到最好的做法是使用“cons” 当我这样做的时候: (cons (Listof Number) (Listof (Listof Number))) 它工作得非常好,但它给了我一个镜子,让我知道我应该得到什么。因此,我尝试: (cons (Listof (Listof Number)) (Listof Number) ) 这导致: 类型检查器:无法将多态函数“cons”应用于 论据: 论据1: 预期:a 给定:(Listof(
(cons (Listof Number) (Listof (Listof Number)))
它工作得非常好,但它给了我一个镜子,让我知道我应该得到什么。因此,我尝试:
(cons (Listof (Listof Number)) (Listof Number) )
这导致:
类型检查器:无法将多态函数“cons”应用于
论据:
论据1:
预期:a
给定:(Listof(Listof Real))
论据2:
预期:(a名单)
给定:(不动产清单)
结果类型:(a的列表)
预期结果:(Listof(Listof Real))
in:(cons acc(从混合列表中获取最小值和最大值(第一个lol)))
这很奇怪,因为报告说:
cons函数实际上接受任何两个值,而不仅仅是一个列表
对于第二个论点
这是我的实际代码:
(:最小和最大列表(->(任何列表的列表))(任何列表的列表的列表(数字的列表)))
(:尾部最小值和最大值列表(->(任何列表的列表))(列表的列表的列表的列表编号))(列表的列表编号)))
(:从混合列表(->(任何列表)(数字列表))中获取最小值和最大值)
(定义(最小和最大列表lol)
(尾部最小值和最大值列出lol’())
(定义(尾部最小和最大列表lol acc)
(如果(空?lol)
行政协调会
(尾部最小值和最大值列表(剩余lol)(cons acc(从混合列表中获取最小值和最大值)(第一个lol(()()))))
(定义(从混合列表mixedList获取最小值和最大值)
(如果为空?(子列表编号混合列表))
'()
(min和maxRec(子列表编号混合列表)(第一个(子列表编号混合列表))(第一个(子列表编号混合列表‘‘‘‘‘)’)
(测试(最小和最大列表’((任何“Benny”10 OP 8)(任何“Benny”OP 2 3)))=>((8 10)()
下面是我的代码使用的各种函数的代码。这些工作正常,因此没有理由检查它们:
#lang pl
(需要机架单元)
(需要拍/跟踪)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;问题1
(:min&maxRec(->(列表编号)编号(列表编号)))
(:最小值和最大值(->编号(编号列表)))
(define(min&max number1 number2 number3 number4 number5);获取所有数字并发送到min&max递归部分
(最小值和最大值(列表编号2编号3编号4编号5)编号1编号1);使所有数字成为一个列表,并具有最大和最小数字
(定义(最小值和最大值)
;逻辑:1)如果已完成列表,则返回结果2)否则,请检查列表头的最大值或最小值,并使用较短的列表和新的最大值或最小值调用函数
(如果(空?myList)
;查看完所有数字后,从myList返回最小值和最大值
(列出最小值和最大值)
(如果(>(第一个myList)max);头部是否最大?
(最小值和最大值(剩余myList)(第一个myList)最小值)
(如果(<(第一个myList)最小值);头部是否为最小值?
(最小值和最大值(剩余myList)最大值(第一个myList))
(最小值和最大值(剩余myList)最大值最小值(()()))
(测试(最小值和最大值2 3 2 7 1)=>'(1 7))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;问题2 a
(:子列表编号(->(任何列表)(编号列表)))
(:尾部子列表编号(->(任何列表)(编号列表)(编号列表)))
;;此func调用diff func,因为尾部递归需要累加器。
(定义(子列表编号myList)
(尾部子列表编号myList`())
;;这使用尾部递归(所有计算在递归之前不进行,并通过累加器发送)
(定义(尾部子列表编号myList acc)
(如果(空?myList)
acc;如果已完成列表中的所有VAR
(如果(编号)(第一个myList))
(尾部子列表编号(剩余myList)(cons(第一个myList)acc));如果列表头是一个编号,则将其添加到acc,并继续处理列表的其余部分
(尾部子列表编号(剩余myList)acc);否则抛出这个变量并处理列表的其余部分
请注意,当您在#lang racket
中链接到cons
时,它与其他语言中的cons
不同,如#lang pl
。不同语言中的相同名称和函数可以相同,但通常是不同的。例如,cons
和#中的朋友!R6R
是从mcons
和#lang racket
我不知道什么是#lang pl
,但它似乎是以某种方式键入的。我假设当你说你这样做的时候:
(cons (Listof Number) (Listof (Listof Number)))
你的意思是你做:
(cons a b)
其中a
为(编号列表)
类型,b
为(编号列表)
。我注意到第二种类型是第一种类型的列表。在你的试验中,这两种类型没有这种关系,相反。您可能已经切换了参数,并且acc
的正确代码是:
(cons (get-min&max-from-mixed-list (first lol)) acc)
我假设cons
的类型规范可能要求第二个列表的类型与第一个参数的类型相同。对于Scheme和#lang racket
等非类型化语言,这两个参数中可以有任何类型
#lang racket
(cons 3 #f) ; ==> (3 . #f)
嗨,根据我的理解,pl在“cons”中应该非常相似,但也许我错了。。。你知道怎么解决这个问题吗?我已经更新了答案。我相信你已经切换了第一个和第二个参数。嘿,是的,你做“(cons(从混合列表中获取最小值和最大值(第一lol))acc)时的权利”一切都正常,但我得到(()”((8 10))而不是(((8 10)),因此我尝试做:“(cons acc(从混合列表中获取最小值和最大值(第一lol))”@Tomer If
(cons'a'(b));=>(a b)
以错误的顺序给出答案,然后(cons'(b)'a);==>((b).a)
不是解决方案。在最后一步中,在acc
上执行反向操作是可行的。