我想仅使用 sml 中的高阶函数对矩阵进行转置,但我真的很堆栈

Emm*_*mma 1 sml smlnj

我想仅使用 sml 中的高阶函数对矩阵进行转置,但我真的很堆栈,这就是我所拥有的

fun transpose [] = []
| transpose ([]::_) = []
| transpose mat = (map hd mat)::(transpose(map tl mat));
Run Code Online (Sandbox Code Playgroud)

但我不想调用转置,因为再次不允许递归。我也想摆脱案例。有什么帮助吗?

qap*_*hla 5

transpose mat = tabulate (length (nth (mat,0)),fn i => map (fn l => (nth (l,i))) mat)
Run Code Online (Sandbox Code Playgroud)

或者,为了提高空矩阵的可读性和安全性:

transpose mat =
  let
    val rows = length mat
    val cols = if rows > 0
               then length (nth (mat,0))
               else 0
  in
    tabulate (cols, fn i => map (fn row => (nth (row, i)) mat)
  end
Run Code Online (Sandbox Code Playgroud)