【发布时间】:2020-02-19 08:22:22
【问题描述】:
我想在 SML/NJ 中编写一个函数,它将 2 个矩阵作为参数并将它们相乘。
我只能使用:
-
函数dot,取2个向量并计算标量积:
fun dot (xs: int list, ys: int list): int = List.foldl (fn (x,y) => x+y) 0 (ListPair.map (fn (x,y) => x*y) (xs, ys)) -
函数转置,取1个矩阵并计算该矩阵的转置:
fun transpose (m: 'a list list): 'a list list = List.tabulate (List.length (List.nth (m, 0)), fn x => List.map (fn y => (List.nth (y, x))) m)匿名函数
结构列表、ListPair 和数学
我要写的函数应该是这样的:
fun multiply (a: int list list, b: int list list): int list list
到目前为止,我已经这样做了:
fun multiply (a: int list list, b: int list list): int list list =
case a of
[] => []
| g::rep => [(List.map (fn y => dot(g, y)) transpose(b))] @ (multiply(rep, b))
但是我收到了这个错误:
test.sml:66.21-66.62 Error: operator and operand do not agree [tycon mismatch]
operator domain: int list list
operand: 'Z list list -> 'Z list list
in expression:
(List.map (fn y => dot <exp>)) transpose
如果在函数 multiply 的最后一行我写的是 b 而不是 tranpose(b),我没有收到任何错误,但是当然,如果我这样做,我不会得到我想要的结果:
fun multiply (a: int list list, b: int list list): int list list =
case a of
[] => []
| g::rep => [(List.map (fn y => dot(g, y)) b)] @ (multiply(rep, b))
我不知道我还能做什么。有人能帮帮我吗?
【问题讨论】: