LINUX.ORG.RU

Standard ML - sort list

 


0

3

я пытаюсь написать функцию в SML которая получаем String * real list и возвращает лексикография sort list по первому элементу (string). например функция получает: [(«c»,1.0),(«b»,2.0),(«a»,2.0)] тогда функция вернет: [(«a»,2.0),(«b»,2.0),(«c»,1.0)]

как решить эту проблему?

local
    val foldl = List.foldl
    val compare = String.compare
    val rec sort = fn (x::xs, y::ys) =>
        val (a, b) = x
        val (a1, b1) = y
        case compare(a, a1) of
          LESS => x::(sort(y, xs))
        | EQUAL => x::y::xs
        | GREATER => y::x::xs
in
    val sorted = fn x::xs =>
        foldl(sort, [x], xs)
end

sorted должно быть тем, что тебе нужно. По крайней мере, я целый час почитал мануалы по SML :)

Virtuos86 ★★★★★ ()
Последнее исправление: Virtuos86 (всего исправлений: 1)
Ответ на: комментарий от Virtuos86
local
    val foldl = List.foldl
    val compare = String.compare
    val rec sort = fn (x::xs, y) =>
        val (a, b) = x
        val (a1, b1) = y
        case compare(a, a1) of
          LESS => x::(sort(y, xs))
        | EQUAL => x::y::xs
        | GREATER => y::x::xs
in
    val sorted = fn x::xs =>
        foldl(sort, [x], xs)
end

Гм, накосячил. Теперь как надо.

Virtuos86 ★★★★★ ()
Последнее исправление: Virtuos86 (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

а как можно сделать с помощью fun sort [] = ... (без local). и как мозжно без List.foldl?

спосибо

verilog ()
Ответ на: комментарий от verilog

Не, парень, попробуй сам. Оценки за тебя я получать буду?)

Ты мне лучше скажи, мой код хотя бы рабочий? У меня проверить не на чём сейчас, а у тебя хоть какая-то среда для разработки на Standard ML должна быть настроена.

и как мозжно без List.foldl?

Функцию левой свёртки можно, конечно, написать самому, но как-то грустно и скучно, если в стандартной библиотеке уже есть готовая.

Virtuos86 ★★★★★ ()
Ответ на: комментарий от Virtuos86

Это не домашка. Я пытаюсь выучит SML сам. Нашел вопрос в интернете и не могу не как рещить. Я ещё не дошел до local так что я не знаю как с ней пользователь. Если будет у вас время, буду рад о помощи. Спасибо

verilog ()
Ответ на: комментарий от verilog

Я пытаюсь выучит SML сам

Учи его по учебнику. Там есть примеры решения задач.

tailgunner ★★★★★ ()
Ответ на: комментарий от verilog

Посмотри на coursera курс Programming Languages, первую часть.

anonymous ()
virtuos86@minas-itil ~/SML $ cat lexicographic_list_sort.sml
val list = [("c", 1.0), ("b", 3.0), ("a", 1.0), ("d", 5.0)];

(* Функция левой свёртки (каррированная) *)
fun foldl func init [] = init
  | foldl func init (head::tail) = foldl func (func (head, init)) tail;

(* Функция сортировки *)
fun sort ((a, b), []) = (a, b)::[]
  | sort ((a, b), (a1, b1)::xs) =
      case String.compare(a, a1) of
        LESS => (a, b)::( (a1, b1)::xs )
      | EQUAL => (a, b)::( (a1, b1)::xs )
      | GREATER => (a1, b1)::( sort((a, b), xs) );

(* Функция получения отсортированного списка *)
fun sorted [] = []
  | sorted (x::[]) = [x]
  | sorted (x::xs) = foldl sort [x] xs;

sorted list;
virtuos86@minas-itil ~/SML $ sml lexicographic_list_sort.sml 
Standard ML of New Jersey v110.81 [built: Tue May 15 08:04:45 2018]
[opening lexicographic_list_sort.sml]
val list = [("c",1.0),("b",3.0),("a",1.0),("d",5.0)] : (string * real) list
val foldl = fn : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b
[autoloading]
[library $SMLNJ-BASIS/basis.cm is stable]
[library $SMLNJ-BASIS/(basis.cm):basis-common.cm is stable]
[autoloading done]
val sort = fn : (string * 'a) * (string * 'a) list -> (string * 'a) list
val sorted = fn : (string * 'a) list -> (string * 'a) list
val it = [("a",1.0),("b",3.0),("c",1.0),("d",5.0)] : (string * real) list
- 
Virtuos86 ★★★★★ ()
Ответ на: комментарий от Virtuos86

Полезные ссылки, пусть будут здесь: http://sml-family.org/Basis/ (например, http://sml-family.org/Basis/real.html), http://homepages.inf.ed.ac.uk/stg/NOTES/node2.html, http://www.soc.napier.ac.uk/course-notes/sml/, http://www.cs.cornell.edu/riccardo/prog-smlnj/notes-011001.pdf (на вид довольно хороший тьюториал), а с http://www.smlnj.org/ в принципе нужно начинать, чтобы развернуть рабочую среду у себя на компьютере.

Virtuos86 ★★★★★ ()
Ответ на: комментарий от verilog

Лучше б с окамла начал. Он хоть на практике применяется в отличии от.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.