Преобразование int в реальное в SML - PullRequest
2 голосов
/ 29 марта 2019

Новичок в SML

У меня есть следующий код, который возвращает абсолютное значение списка.Мне нужно, чтобы он был типа int list -> real list.Где я могу разместить оператор, который преобразует его в реальный, ограничивая этот код одной строкой?

val myabs = map(fn x => if x >= 0 then x else ~x) [1,~2, 3, ~4];

1 Ответ

1 голос
/ 01 апреля 2019

Вы конвертируете int в real , используя Real.fromInt:

- Real.fromInt 42;
> val it = 42.0 : real

Вы можете преобразовать int список в реальный список с помощью 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 :

- (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, как математика.
...