2010-09-15 4 views

ответ

20

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

datatype wrapper = Int of int | Real of real | String of string 

Затем вы можете шаблон матч на конструкторе:

case x of Int x -> foo 
     | Real x -> bar 
     | String x -> ... 

В этом случае x явно напечатан как wrapper, так что это сработает.

8

Невозможно выполнить то, что вы хотите в целом, даже если x имеет полиморфный тип (не делая обертывания себя, как предлагает Чак).

Это преднамеренное дизайнерское решение; он позволяет делать очень сильные выводы о функциях, только исходя из их типов, что вы не могли бы сделать иначе. Например, он позволяет вам сказать, что функция с типом 'a -> 'a должна быть функцией идентификации (или функцией, которая всегда выдает исключение или функцию, которая никогда не возвращается). Если бы вы могли проверять, что 'a был во время выполнения, вы могли бы написать программу трусливый как

fun sneaky (x : 'a) : 'a = if x = int then infinite_loop() else x 

, что нарушило бы правило. (Это довольно простой пример, но есть много менее тривиальных вещей, которые вы можете сделать, зная, что ваша система типов имеет это свойство.)