F#中的值限制

  • 本文关键字: f# value-restriction
  • 更新时间 :
  • 英文 :


我有一个F#赋值,我试图计算矩阵的转置。很简单,但我一直收到一个值限制错误,我不知道为什么。我查阅了很多VR错误问题,但我仍然蒙在鼓里。这是我的代码:

let transpose = function
    | [xs ; ys] -> 
                let rec transpose_helper = function
                    | [],[] -> []
                    | x::xs , y::ys -> [x;y] :: transpose_helper (xs,ys)
                    | _ -> failwith "The matrix is not a square matrix"
                transpose_helper(xs,ys)
    | _ -> failwith "Incorrectly formatted input"
transpose ([[1;2;3];[2;3;4]]);;

我认为错误的部分原因是空列表,但我所做的似乎都无济于事。任何建议都将不胜感激。

编辑:以下版本的代码有效。有人能解释为什么吗?

let transpose zs =
    match zs with 
    | [xs;ys] -> 
                let rec transpose_helper (xs, ys) = 
                    match (xs,ys) with
                    | ([],[]) -> []
                    | (x::xs , y::ys) -> [x;y] :: transpose_helper (xs,ys)
                    | _ -> failwith "The matrix is not a square matrix"
                transpose_helper(xs,ys)
    | _ -> failwith "Incorrectly formatted input"
transpose ([[1;2;3];[2;3;4]]);;
val transpose : zs:'a list list -> 'a list list
val it : int list list = [[1; 2]; [2; 3]; [3; 4]]

然而,编译器仍然抱怨上面的转置调用应该有一个单元类型,除非我使用let绑定它。有人能澄清一下这里发生了什么吗?

我的猜测是,您最初编写了这个let rec transpose zs = match zs with ...,后来将其改为使用function,这样就不需要显式参数了。由于zs仍然存在,您的函数接受两个args,这意味着您只部分应用了它。由于zs未使用,其类型未知,因此部分应用的函数返回一个泛型函数(值限制)。移除zs,一切正常。

相关内容

  • 没有找到相关文章

最新更新