Идиоматическая схема и общее программирование, почему только на числах? - PullRequest
2 голосов
/ 22 апреля 2010

В схеме такие процедуры, как +, -, *, / работают с различными типами чисел, но мы не видим много других общих процедур.

Например, длина работает только для списка, поэтому необходимы длина вектора и длина строки.

Я предполагаю, что это происходит из-за того, что язык на самом деле не предлагает какого-либо механизма для определения универсальной процедуры (кроме, конечно, cond), такой как "классы типов" в Haskell или стандартизированной объектной системе.

Существует ли какой-то идиоматический способ обработки общих процедур, о которых я не знаю?

Ответы [ 5 ]

2 голосов
/ 22 апреля 2010

Помня о том, что все "разные типы чисел" - это все номера схем (т.е. (number? n) равно #t) - это поведение действительно имеет смысл. +, -, *, / и все другие арифметические операторы работают только с числами (хотя на других языках они будут классифицироваться как различные типы чисел int, long, float, и т.д ...) Это связано с тем, что вы не можете явно объявить числовые типы в схеме.

Если вам действительно нужно универсальное решение, кроме использования внешних библиотек, самый простой способ - свернуть свое собственное:

(define org-length length)
(define (length x)
  (cond
    ((string? x) (string-length x))
    ((vector? x) (vector-length x))
    ; keep going ...
    (else (org-length x))))
1 голос
/ 31 мая 2010

Наконец, я нашел очень аккуратное решение в схеме PLT:

(require (rename-in scheme [length list-length]))

(define length
 (λ (x)
  ((cond [(list? x) list-length]
         [(string? x) string-length]
         [(vector? x) vector-length]
         [else (error "whatever")]) x)))

(length '(a b c))
(length "abc")
(length #(1 2 3))  
1 голос
/ 23 апреля 2010

Вы действительно хотите иметь объектную систему для этого.Например, вы можете захотеть взглянуть на Tiny CLOS , который является де-факто стандартной объектной системой для Chicken Scheme (см. Справочное руководство ), но, кажется, доступендля большинства реализаций Схемы.

1 голос
/ 23 апреля 2010

Прочтите SICP, разделы 2.4 и 2.5, которые охватывают реализацию процедур, которые могут работать с общими типами данных посредством прикрепления «тегов» к объектам данных. Это также в лекции 4-B этой серии видео MIT.

1 голос
/ 22 апреля 2010

Нет, но вы можете построить свой собственный. Добро пожаловать в Схему!

В прошлом я использовал Swindle для предоставления общих функций. Он поставляется в комплекте с PLT Scheme . Это хорошо сработало для меня, но прошло несколько лет. Там могут быть другие альтернативы сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...