Расширение # в sml - PullRequest
       1

Расширение # в sml

7 голосов
/ 19 февраля 2011

Предположим, у меня есть список в sml, который очень большой, затем sml показывает несколько записей, а затем начинает показывать символ #.

Может кто-нибудь сказать мне, как я могу просмотреть весь список?

Ответы [ 3 ]

11 голосов
/ 22 февраля 2011

Предполагая, что это SML / NJ, вы можете использовать printLength, printDepth и друзей из структуры Control.Print .

Ниже приведен фрагмент из документации структуры Control.Print :

printDepth
    The depth of nesting of recursive data structure at which ellipsis begins. 

printLength  
    The length of lists at which ellipsis begins. 

stringDepth
    The length of strings at which ellipsis begins. 

Таким образом, например, мы можем изменить количество элементов списка, которые мы не хотим отображать в REPL, изменив ссылку printLength

- Control.Print.printLength;
val it = ref 12 : int ref
- [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19];
val it = [1,2,3,4,5,6,7,8,9,10,11,12,...] : int list

- Control.Print.printLength := 18;
val it = () : unit
- [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19];
val it = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,...] : int list

- Control.Print.printLength := 100;
val it = () : unit
- [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19];
val it = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19] : int list

Обратите внимание, что для строк и структур данных многоточие записывается в виде хеша '#'. Это, например, видно из приведенной ниже строки. Обратите внимание на '#' в конце строки val it = ..., потому что глубина печати строк по умолчанию составляет 70 символов:

- "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
val it = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusm#" : string

- Control.Print.stringDepth;
val it = ref 70 : int ref

И, наконец, пример того, как это видно во вложенных структурах данных:

- Control.Print.printDepth;
val it = ref 5 : int ref
- SOME (SOME (SOME (SOME (SOME (SOME (SOME 42))))));
val it = SOME (SOME (SOME (SOME (SOME #))))
  : int option option option option option option option

- Control.Print.printDepth := 10;
val it = () : unit
- SOME (SOME (SOME (SOME (SOME (SOME (SOME 42))))));
val it = SOME (SOME (SOME (SOME (SOME (SOME (SOME 42))))))
  : int option option option option option option option

Два предложенных решения приведут к печати всего списка независимо от его длины.

2 голосов
/ 22 февраля 2011

Сокращенная версия кода Сабастьяна П.:

fun printList f ls =
    print ("[" ^ String.concatWith ", " (map f ls) ^ "]\n");
1 голос
/ 19 февраля 2011

Вы можете сделать что-то вроде этого:

(* Prints a list in its entirety.
 * ls is a list of type 'a list
 * f is a function that converts an 'a to string *)
fun printList f ls =
  let
    (* Prints the contents of the list neatly using f *)
    fun printContents []  = ()
      | printContents [x] = print (f x)
      | printContents (x::xs) = (print (f x ^ ", "); printContents xs)

    val _ = print "[";
    val _ = printContents ls;
    val _ = print "]\n"
    in
        ()
    end;

Пример его использования:

val ls = List.tabulate (1000, fn n => n);
printList Int.toString ls;

Если вы хотите сделать это автоматически, я сомневаюсь, что вы можете.Если я правильно помню, симпатичные принтеры зависят от конкретной реализации и, скорее всего, не позволяют устанавливать симпатичные принтеры для полиморфных типов.

...