Как распечатать информацию о типе в SML? - PullRequest
1 голос
/ 27 апреля 2009

После выполнения команды в SML возвращается «оно», в котором содержатся данные и тип, возвращаемый из команды. Например:

false;  
val it = false : bool

Допустим, у меня есть привязка в программе, например:

 val argsToOutput = (map (fn (Absyn.var_exp(n)) => 
                               (lookupReference env n)) exps)

Есть ли способ напечатать значение и тип данных "argsToOutput" (в середине программы) аналогично тому, как распечатывается "оно"?

Ответы [ 3 ]

2 голосов
/ 01 мая 2009

Вы можете сделать:

 val argsToOutput = (map (fn (Absyn.var_exp(n)) => 
                               (lookupReference env n)) exps)
 ...
 in
   (print (argsToOutput); 2 )
 end

где вместо 2 у вас есть значение вашего тела let. Вероятность того, что print будет смещена на argsToOutput, но она даст вам тип, найденный там, где ожидаемый тип - строка.

Когда мне пришлось распечатать значение типа данных, я создал функцию tostring (), которая взяла тип данных и преобразовала его в строку. Потребовалась некоторая работа, потому что у нее было несколько вложенных типов данных, но впоследствии она была очень ценной, потому что она работала со всеми переменными этого типа.

1 голос
/ 02 мая 2009

Есть ли способ напечатать значение и тип данных "argsToOutput" (в середине программы)

Нет. Он работает на верхнем уровне, потому что компилятор сохраняет тип на этапе компиляции. Он не будет работать с произвольными выражениями, извлеченными из функциональных тел. НО, если вам повезло иметь выражение, значение которого не зависит от функции, вы можете вытащить его и написать привязку val на верхнем уровне и получить то, что вы хотели:

- val thing = hd [1, 2, 3];
val thing = 1 : int

Это слабое утешение, поскольку оно охватывает мало интересных случаев.

Я думаю, что вы можете искать ответы на другие часто задаваемые вопросы:

  1. Как я могу заставить мои программы ML проходить проверку типа?
  2. Как я могу быть уверен в типе подвыражения в хорошо типизированной программе ML?
  3. Как в программе ML можно распечатать значение для отладки?

(Ответы безобразны.)

1 голос
/ 27 апреля 2009

SML имеет статическую типизацию, поэтому тип любого значения в программе статически известен во время компиляции. Я не уверен, что вы хотите, когда вы хотите «распечатать».

Может быть, вы не можете понять, глядя на код самостоятельно, что это за тип. Когда вы определяете значение на верхнем уровне в интерпретаторе, либо напрямую, либо если вы загружаете файл, используя use "whatever.sml";, интерпретатор сообщит вам тип, выведенный для этого значения.

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

Если вы хотите убедиться, что определенное значение относится к определенному типу, вы можете использовать защиту типа: (expression : type) - это то же самое, что и expression, за исключением того, что во время проверки типа он будет гарантировать, что это выражение того типа .

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

...