Новичок в SML
У меня есть следующий код, который возвращает абсолютное значение списка. Мне нужно, чтобы он был типа int list -> реальный список. Где мне разместить оператор, который преобразует его в реальный, ограничивая этот код одной строкой?
val myabs = map(fn x => if x >= 0 then x else ~x) [1,~2, 3, ~4];
Вы конвертируете инт в настоящий, используя Real.fromInt
:
- Real.fromInt 42;
> val it = 42.0 : real
Вы можете преобразовать целый список в реальный список с помощью List.map Real.fromInt
:
- List.map Real.fromInt [1, 2, 3];
> val it = [1.0, 2.0, 3.0] : real list
Вы можете преобразовать целое число в его абсолютное значение, используя Int.abs
:
- Int.abs ~42;
> val it = 42 : int
Вы можете объединить эти две функции и, таким образом, обе преобразовать целое число в его абсолютное значение и преобразовать его в настоящий:
- (Real.fromInt o Int.abs) ~42;
> val it = 42.0 : real
И вы можете сделать это для всего списка, используя List.map (Real.fromInt o Int.abs)
:
- List.map (Real.fromInt o Int.abs) [~1, ~2, ~3];
> val it = [1.0, 2.0, 3.0] : real list
Вы можете выразить это как одну функцию:
fun myabs xs = List.map (fn x => Real.fromInt (Int.abs x)) xs
И вы можете немного сократить эту функцию:
val myabs = List.map (fn x => Real.fromInt (Int.abs x))
val myabs = List.map (fn x => (Real.fromInt o Int.abs) x)
val myabs = List.map (Real.fromInt o Int.abs)
Таким образом, недостающими частями были:
if x >= 0 then x else ~x
используйте Int.abs x
.x
в реальный, используйте Real.fromInt x
.f (g x)
или (f o g) x
, например, в математике.