2016-02-29 3 views
-1

Я очень неопытен в ML, и я просто не могу понять это.Стандартная полиморфная сортировка ML

Начала вопрос

Полиморфной Сортировка

Эта функция выполняет вставки сортировку списка принимает в качестве аргументов функции сравнения меньше и список л элементов, отсортированных. Код компилируется и работает правильно:

fun sort(less, nil) = nil | 
    sort(less, a : : l) = 
     let 

fun insert(a, nil) = a : : nil | 
    insert(a, b : : l) = if less(a,b) then a : : (b: : l) 
            else b : : insert(a, l) 

in 
    insert(a, sort(less, l)) 
end; 

Каков тип функции сортировки? Вкратце объясните, включая тип вставки вспомогательной функции. Вам не нужно запускать алгоритм ML на этот код; просто объясните, почему обычный программист ML ожидал, что код будет иметь этот тип. () Вопрос)

Я получил тип функции сортировки (запустив код в интерпретаторе SML), но я просто не могу получить вторую часть о вставке.

Тип функции сортировки:

val sort = fn : ('a * 'a -> bool) * 'a list -> 'a list 

Любая помощь будет принята с благодарностью.

+0

Если вы обнаружили тип' sort' в SML РЕПЛ почему вы не сделать то же самое для 'insert'? В любом случае - это выглядит как домашнее задание. Если это так, в тексте курса должно быть достаточно подробное обсуждение системы типов SML. Вы читали? Вы воспроизвели вопрос, но не задавали никаких вопросов по своему усмотрению, по крайней мере, не вопрос, который демонстрирует какие-либо усилия с вашей стороны. –

+0

Я прочитал его, и я его не понимаю (вот почему я пришел сюда). Кроме того, я включил функцию вставки в компилятор, и я получил эту «забавную вставку (a, nil) = a :: nil | Вставка (a, b :: l) = если меньше (a, b), то a :: (b :: l) else b :: insert (a, l) ' – user3313728

+0

Я набрал часть' fun insert' и он говорит: 'stdIn: 9.24-9.28 Ошибка: unbound variable или constructor: less' – user3313728

ответ

3

То, что вы выяснили тип sort путем «обмана», делает следующий шаг труднее; не используйте ярлыки.
(. Никто никогда не узнал ничего от выглядывает в ответ)

Но вот как вы могли бы выяснить insert:

Вы знаете из

val sort = fn : ('a * 'a -> bool) * 'a list -> 'a list 

, что второй аргумент sort является 'a list ,

В

insert(a, sort(less, l)) 

вы можете сразу увидеть, что он имеет некоторый тип (X * Y) -> Z для некоторогоX, Y и Z.

Вы передаете первый элемент второго аргумента sort - a - как первый аргумент insert.
Вторым аргументом sort является 'a list, первым элементом этого списка является 'a.
Так X является 'a, и теперь мы знаем, что insert является ('a * Y) -> Z для некоторыхY и Z.

Второй аргумент insert - sort(less, l) - хорошо известен; это 'a list.
Итак, мы теперь знаем, что Y является 'a list и insert является ('a * 'a list) -> Z для некоторыхZ.

Все, что остается возвращаемый тип, а с

insert(a, sort(less, l)) 

что sort возвращается, он должен иметь тот же тип возвращаемого sort.
So Z является 'a list.

В целом, тип insert «s является

('a * 'a list) -> 'a list 
+0

Я бы не сказал, что это «обман», чтобы увидеть, какой тип ML появляется, поскольку акцент, кажется, на * объясняет * значение типа. Для новичков трудно даже разобрать что-то вроде '('a *' a -> bool) * 'list ->' list', не говоря уже о убедительном объяснении того, что это значит. –

Смежные вопросы