Проверить, является ли ввод действительным целым числом

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

fun realorinteger (n) = если n = int, то true else false;

но это точно не работает. Я также пробовал, если n в int.

Любая помощь?


person 700resu    schedule 02.10.2012    source источник


Ответы (1)


Ты не сможешь это сделать.

Система типов просто не позволяет функции принимать несколько разных типов и действовать в зависимости от того, какой это тип. Либо ваша функция принимает int, либо real. (Или он принимает оба, но также может принимать strings, lists и т. Д ... т.е. полиморфен)

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

datatype intorreal = IVal of int | RVal of real

Затем вы можете использовать сопоставление с образцом для такого значения, чтобы извлечь желаемое число:

fun realorinteger (IVal i) = ... (* integer case here *)
  | realorinteger (RVal r) = ... (* real case here *)

Тогда эта функция будет иметь тип intorreal -> x, где x - это тип выражений с правой стороны. Обратите внимание, что в обоих случаях результирующее значение должно быть одного типа.

Примером такой функции может быть функция округления:

fun round (IVal i) = i
  | round (RVal r) = Real.round r

Что потом называется так:

val roundedInt  = round (IVal 6);
val roundedReal = round (RVal 87.2);
person Sebastian Paaske Tørholm    schedule 02.10.2012