F#中的乘法函数始终以failwith返回

时间:2015-10-16 03:50:37

标签: f#

我试图在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是不正确的,所以我想解决这个问题,如果是这样的话就能输出错误。

1 个答案:

答案 0 :(得分:3)

您的问题出在递归中 - 您这样做:

multiply(xs,ys)

这将在xs=[]发生失败时发生。

最好的解决方案可能是有一个包装函数 - 比如

let multiply a b = 
    check a
    check b
    let rec actualmultiply = ...
    actualmultiply a b