Как я могу напечатать полиморфные значения в Standard ML? - PullRequest
6 голосов
/ 30 марта 2009

Есть ли способ напечатать полиморфные значения в Standard ML (особенно SML / NJ)? У меня есть полиморфная функция, которая не выполняет то, что я хочу, и из-за плачевного состояния, которое отлаживается в SML (см. Есть ли в реальной практике отладка производственной функциональной программы? ), я хотел бы посмотреть, что это делает с некоторыми добрыми print. Простой пример (по подсказке):

fun justThisOnce(x : 'a) : 'a = (print(x); x);
justThisOnce(42);

Другие предложения приветствуются. В то же время я продолжу смотреть код ошибки в отправку.

Обновление

Мне удалось найти ошибку, но вопрос все еще стоит в надежде предотвратить будущие боль и страдания.

Ответы [ 2 ]

8 голосов
/ 31 марта 2009

Нет, нет способа напечатать полиморфное значение. У вас есть два варианта:

  • Специализируйте свою функцию на целых числах или строках, которые легко распечатываются. Затем, когда ошибка убита, сделайте ее снова полиморфной.

  • Если ошибка проявляется только при каком-либо инстанцировании, передайте show в качестве дополнительного аргумента вашей функции. Так, например, если ваша полиморфная функция имеет тип

    'a list -> 'a list
    

    Вы расширяете тип до

    ('a -> string) -> 'a list -> 'a list
    

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

    Это очень утомительно, но помогает. (Но имейте в виду: это может заставить вас попробовать Haskell.)

0 голосов
/ 30 марта 2009

Только в MOSML : просто для целей отладки используйте функцию printVal. Обратите внимание, что эта функция доступна только в режиме верхнего уровня, она вызовет ошибку при попытке скомпилировать вашу программу.

Редактировать : В таком случае, боюсь, что общего решения не существует, вам нужно явно перевести ваши значения в строки и распечатать их. Смотрите другой ответ для хороших предложений.

...