我试图在F#中编写一个函数,用于将2个矩阵相乘。它使用转置函数来查找给定矩阵的转置。
let rec transpose = function
| [] -> failwith "Error, no matrix supplied"
| xs when List.head xs = [] -> []
| xs -> List.map (fun n -> List.head n) xs :: transpose
(List.map(fun n -> List.tail n) xs);;
let rec multiply = function
|([], []) -> []
|([], ys) -> failwith "Empty matrix"
|(xs, []) -> failwith "empty matrix"
|(x::xs, ys) -> let t = transpose ys
List.map(fun n -> inner x n) t :: multiply(xs,ys);;
无论输入是什么,我的乘法函数总是执行" failwith"如果我以[0]返回,而不是failwith,则该功能完美无缺。但是当我将矩阵与空矩相乘时我觉得0是不正确的,所以我想解决这个问题,如果是这样的话就能输出错误。
答案 0 :(得分:3)
您的问题出在递归中 - 您这样做:
multiply(xs,ys)
这将在xs=[]
发生失败时发生。
最好的解决方案可能是有一个包装函数 - 比如
let multiply a b =
check a
check b
let rec actualmultiply = ...
actualmultiply a b