我有一个数组P,它代表一个矩阵,作为一个行向量数组(这种表示对我来说更方便),我想提取该数组的列向量j.我的第一关是:
let column (M: float[][]) (j: int) =
Array.map(fun v -> v.[j]) M
Run Code Online (Sandbox Code Playgroud)
这无法编译,告诉我v.[j]在不确定类型的对象上使用operator expr.[idx].这对我来说很困惑,因为将鼠标悬停在v上会将v识别为float [],我相信它是一个行向量.
此外,以下代码有效:
let column (M: float[][]) (j: int) =
Array.map(fun v -> v) M
|> Array.map (fun v -> v.[j])
Run Code Online (Sandbox Code Playgroud)
我不明白第二个例子与第一个例子有何不同.第二个示例中的第一个映射看起来是多余的:我将数组映射到自身,但这似乎解决了类型确定问题.
任何帮助,了解我做错了什么或不看,将不胜感激!
问题是F#类型推断严格从左到右,以便编译器看到
let column (M: float[][]) (j: int) =
Array.map(fun v -> v.[j])
Run Code Online (Sandbox Code Playgroud)
在这一点上,它完全不知道v所以它会抛出一个错误.这就是前向管道操作员|>如此常见的原因 - 将代码重写为
let column (M: float[][]) (j: int) =
M |> Array.map(fun v -> v.[j])
Run Code Online (Sandbox Code Playgroud)
很好.这也是你的第二个例子有效的原因