Функция cons не принимает мой ввод
Ну, я пытаюсь добавить два элемента, чтобы стать списком, и из видео профессора Коллин Льюис в минуту 4 и 53 секунды, и с официального сайта ракетки я увидел, что лучшая практика - использовать "минусы".
Когда я сделал:
(cons (Listof Number) (Listof (Listof Number)))
Это сработало на отлично, но дало мне зеркало того, что я должен получить. Поэтому я попытался:
(cons (Listof (Listof Number)) (Listof Number) )
Это привело к:
Проверка типов: Полиморфная функция "cons" не может быть применена к аргументам:
Аргумент 1:
Ожидаемое:
Дано: (Listof (Listof Real))
Аргумент 2:
Ожидаемый: (Список)
Дано: (Список реальных)
Тип результата: (Список)
Ожидаемый результат: (Listof (Listof Real))
в: (минусы соотв (get-min&max-from-mixed-list (first lol)))
Это странно, так как официальный сайт говорит, что:
Функция cons на самом деле принимает любые два значения, а не просто список для второго аргумента.
Вот мой фактический код:
(: min&max-lists (-> (Listof (Listof Any)) (Listof (Listof Number))))
(: tail-min&max-lists (-> (Listof (Listof Any)) (Listof (Listof Number)) (Listof (Listof Number))))
(: get-min&max-from-mixed-list (-> (Listof Any) (Listof Number)))
(define (min&max-lists lol)
(tail-min&max-lists lol '()))
(define (tail-min&max-lists lol acc)
(if (null? lol)
acc
(tail-min&max-lists (rest lol) (cons acc (get-min&max-from-mixed-list (first lol))))))
(define (get-min&max-from-mixed-list mixedList)
(if (null? (sublist-numbers mixedList))
'()
(min&maxRec (sublist-numbers mixedList) (first (sublist-numbers mixedList)) (first (sublist-numbers mixedList)))))
(test (min&max-lists '((any "Benny" 10 OP 8) (any "Benny" OP (2 3)))) => '((8 10) ()))
Вот код для всех видов функций, которые использует мой код. Они работают нормально, поэтому не должно быть оснований для их проверки:
#lang pl
(require rackunit)
(require racket/trace)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Question 1
(: min&maxRec (-> (Listof Number) Number Number (Listof Number)))
(: min&max (-> Number Number Number Number Number (Listof Number) ))
(define (min&max number1 number2 number3 number4 number5) ; gets all numbers and sends to the min&max recursive part
(min&maxRec (list number2 number3 number4 number5) number1 number1)) ; made all numbers to become a list and has max and min numbers
(define (min&maxRec myList max min)
;; logic: 1) if finished list give back result 2) else check if head of list max or min and recall the function with a shorter list and the new max or min
(if (null? myList)
;return the min and max from myList when finished looking at all numbers
(list min max)
(if (> (first myList) max); is the head max?
(min&maxRec (rest myList) (first myList) min)
(if (< (first myList) min) ; is the head min?
(min&maxRec (rest myList) max (first myList) )
(min&maxRec (rest myList) max min)))))
(test (min&max 2 3 2 7 1) => '(1 7))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Question 2 a
(: sublist-numbers (-> (Listof Any) (Listof Number)))
(: tail-sublist-numbers (-> (Listof Any) (Listof Number) (Listof Number)))
;;This func calls a diff func since the tail-recursion needs an accumelator.
(define (sublist-numbers myList)
(tail-sublist-numbers myList `()))
;;this uses tail-recursion (all calculations are dont before the recursion and are sent with an accumelator)
(define (tail-sublist-numbers myList acc)
(if (null? myList)
acc ; if finished all vars in list
(if (number? (first myList))
(tail-sublist-numbers (rest myList) (cons (first myList) acc)) ; if the head of list is a number add it to acc, and continue working on the rest of the list
(tail-sublist-numbers (rest myList) acc)))) ; else throw this var and work on rest of list
1 ответ
Обратите внимание, что когда вы ссылаетесь на cons
в #lang racket
это не то же самое, что cons
на других языках, например #lang pl
, Функции с одинаковыми именами в разных языках могут быть одинаковыми, но часто они разные. Например. cons
и друзья в #!r6rs
сопоставлены с mcons
и друзья в #lang racket
Я понятия не имею что #lang pl
есть, но кажется, что это как-то набрано. Я предполагаю, что когда вы говорите, вы делаете:
(cons (Listof Number) (Listof (Listof Number)))
Вы имеете в виду, что вы делаете:
(cons a b)
куда a
имеет тип (Listof Number)
а также b
имеет тип (Listof (Listof Number))
, Я замечаю, что типом второго является Listof независимо от типа первого. В вашем испытании типы не имеют таких отношений, а наоборот. Вероятно, вы переключили аргументы и что правильный код для acc
является:
(cons (get-min&max-from-mixed-list (first lol)) acc)
Я предполагаю, что спецификация типа cons
может потребоваться, чтобы второй список был списками того же типа, что и тип первого аргумента. Для нетипизированных языков, таких как Scheme и #lang racket
Вы можете иметь любой тип в двух аргументах.
#lang racket
(cons 3 #f) ; ==> (3 . #f)