функция cons не принимает мой ввод

Ну, я пытаюсь добавить два элемента, чтобы получился список, и через 4 минуты и 53 секунды, а также из официальный сайт рэкета Я увидел, что лучше всего использовать «минусы».

Когда я это сделал:

(cons (Listof Number) (Listof (Listof Number)))

Он работал отлично, но дал мне зеркало того, что я предполагал получить. Поэтому я попробовал:

(cons (Listof (Listof Number)) (Listof Number) )

Это привело к:

Проверка типов: Полиморфная функция cons не может быть применена к аргументам:

Аргумент 1:

Ожидается: a

Дано: (Listof (Listof Real))

Аргумент 2:

Ожидается: (Список а)

Дано: (Список реальных)

Тип результата: (Список а)

Ожидаемый результат: (Listof (Listof Real))

in: (cons acc (get-min & max-from-mixed-list (первый лол)))

Это странно, поскольку на официальном сайте написано следующее:

На самом деле функция 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

person Tomer    schedule 07.04.2018    source источник


Ответы (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)). Я замечаю, что тип второго - это список того, что было напечатано на первом. В вашем испытании типы не связаны между собой, а наоборот. Вероятно, вы поменяли аргументы и правильный код для acc:

(cons (get-min&max-from-mixed-list (first lol)) acc)

Я предполагаю, что спецификация типа cons может потребовать, чтобы второй список был списками того же типа, что и тип первого аргумента. Для нетипизированных языков, таких как Scheme и #lang racket, вы можете иметь любой тип в двух аргументах.

#lang racket

(cons 3 #f) ; ==> (3 . #f)
person Sylwester    schedule 07.04.2018
comment
Привет, насколько я понимаю, pl предположительно очень похожи по минусам, но, возможно, я ошибаюсь ... вы знаете, может быть, как решить эту проблему? - person Tomer; 07.04.2018
comment
@Tomer Я обновил свой ответ. Я уверен, что вы поменяли местами первый и второй аргумент. - person Sylwester; 07.04.2018
comment
Эй, да, вы правы, когда делаете (cons (get-min & max-from-mixed-list (first lol)) acc) все работает, но я получаю (() '((8 10)) вместо (' ((8 10) ( )) поэтому я попытался сделать: (cons acc (get-min & max-from-mixed-list (first lol))) - person Tomer; 08.04.2018
comment
@Tomer Если (cons 'a '(b)) ; ==> (a b) дает вам ответ в неправильном порядке, то (cons '(b) 'a) ; ==> ((b) . a) не является решением. Выполнение reverse на acc на последнем этапе - это. - person Sylwester; 08.04.2018