我有一个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绑定它。有谁能请澄清这里发生了什么?
答案 0 :(得分:5)
我的猜测是你最初写了这个let rec transpose zs = match zs with ...
,后来改为使用function
,这就不需要显式参数了。由于zs
仍然存在,因此您的函数接受两个args,这意味着您只是部分应用它。由于zs
未使用,因此其类型未知,使得部分应用的函数返回通用函数 value (值限制)。删除zs
,一切顺利。