как печатать в ML

Я искал и нашел несколько человек, задающих этот вопрос, но не могу найти четкого ответа. Как я могу напечатать нестроковую строку в sml?

Например, если у меня есть экземпляр ADT, то есть типа, объявленного datatype, и я хотел бы распечатать значение для отладки. Отвечаю ли я за написание функции, которая преобразует такой объект в строку, а затем распечатывает строку? Или есть какая-нибудь библиотека для принтеров, которую я должен использовать? Или есть какая-то функция printObject или toString?

Также как я могу напечатать другие нестроковые объекты, такие как true и false?

Казалось бы, sml знает, как печатать такие объекты, потому что, когда я компилирую файл с помощью C-l в emacs, я вижу следующий вывод, показывающий, что sml действительно умеет печатать значения.

[opening /Users/jimka/Repos/mciml/ex1.1.sml]
type key = string
datatype tree = LEAF | TREE of tree * string * tree
val empty = LEAF : tree
val insert = fn : key * tree -> tree
val member = fn : key * tree -> bool
val t1 = TREE (LEAF,"a",LEAF) : tree
val t2 = TREE (LEAF,"a",TREE (LEAF,"c",LEAF)) : tree
val t3 = TREE (LEAF,"a",TREE (TREE (LEAF,"b",LEAF),"c",LEAF)) : tree

val it = true : bool

val it = () : unit

person Jim Newton    schedule 31.12.2020    source источник


Ответы (1)


Как я могу напечатать нестроковую строку в sml?

Насколько я понимаю, это невозможно (переносным способом). В зависимости от реализации, которую вы используете, он может предоставлять функцию, которая это делает.

Также как я могу напечатать другие нестроковые объекты, такие как true и false?

Многие типы с соответствующими базовыми библиотечными структурами (например, int и Int) имеют функцию toString, поэтому вы можете распечатать bool b через print (Bool.toString b) и аналогично Int.toString для int.

Некоторые мысли по поводу реализации:

Для PolyML вы можете использовать функцию PolyML.print для печати значений произвольных типов (хотя вам может потребоваться явно ввести аннотацию; тип аргумента не должен иметь никаких переменных типа).

Для SML / NJ вы можете попробовать взглянуть на подход, обсуждаемый здесь https://sourceforge.net/p/smlnj/mailman/message/21897190/, хотя кажется, что это больше проблем, чем того стоит.

Что касается MLton, мне ничего не известно о полиморфной функции, но у них есть пара руководств по реализации printf или аналогичных.

Похоже, Moscow ML поддерживает функцию Meta.printVal, но только в интерактивном сеансе. Я не уверен, что SML # поддерживает подобные вещи.

Отвечаю ли я за написание функции, которая преобразует такой объект в строку, а затем распечатывает строку?

В общем да.

Казалось бы, sml умеет печатать такие объекты

В зависимости от вашей реализации SML это возможно, потому что REPL имеет доступ к большему количеству информации, чем обычно может иметь программа. Например, SML / NJ может это сделать, потому что REPL имеет доступ к информации о типах, недоступной где-либо еще (источник см. В утверждениях Джона Реппи в связанной ветке почтальона).

Вы также можете найти страницу с примером TypeIndexedValues ​​ MLton, полезной для такого рода вещей, хотя я внимательно не изучал это для себя качества.

person kopecs    schedule 31.12.2020