Ты не сможешь это сделать.
Система типов просто не позволяет функции принимать несколько разных типов и действовать в зависимости от того, какой это тип. Либо ваша функция принимает int
, либо real
. (Или он принимает оба, но также может принимать string
s, list
s и т. Д ... т.е. полиморфен)
Вы можете подделать это, создав тип данных, который инкапсулирует значения, которые могут быть целыми или действительными, например:
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