SML的新手
我有以下代码返回列表的绝对值。我需要它的类型为 int list -> real list。我应该在哪里放置将其转换为实数的语句,同时将此代码限制为一行?
val myabs = map(fn x => if x >= 0 then x else ~x) [1,~2, 3, ~4];
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法将int转换为实数Real.fromInt:
- Real.fromInt 42;
> val it = 42.0 : real
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式将int 列表转换为实数列表List.map Real.fromInt:
- List.map Real.fromInt [1, 2, 3];
> val it = [1.0, 2.0, 3.0] : real list
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法将整数转换为其绝对值Int.abs:
- Int.abs ~42;
> val it = 42 : int
Run Code Online (Sandbox Code Playgroud)
您可以组合这两个函数,以便将整数转换为其绝对值并将其转换为实数:
- (Real.fromInt o Int.abs) ~42;
> val it = 42.0 : real
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令对整个列表执行此操作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
Run Code Online (Sandbox Code Playgroud)
您可以将其表示为单个函数:
fun myabs xs = List.map (fn x => Real.fromInt (Int.abs x)) xs
Run Code Online (Sandbox Code Playgroud)
你可以稍微缩短这个函数:
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)
Run Code Online (Sandbox Code Playgroud)
所以唯一缺少的部分是:
if x >= 0 then x else ~x使用Int.abs x.x为实数,请使用Real.fromInt x.f (g x)或(f o g) x,如数学。