【发布时间】:2018-12-12 15:41:11
【问题描述】:
我想定义一个元组元素的预期数据类型,它将被传递给一个函数。当我不定义它并让类型推断工作时,它是可以的,但是在我想编写仍然没有在任何地方调用的小函数时,我不知道如何定义参数。
这个例子。我希望description 是一个元组,其中五个元素中的每一个都是int,然后提取每个部分以使用。
let setArray (description: int * int * int * int * int) =
let id = fun (i, _, _, _, _) -> i
let startX = fun (_, x, _, _, _) -> x
let startY = fun (_, _, y, _, _) -> y
let width = fun (_, _, _, w, _) -> w
let height = fun (_, _, _, _, h) -> h
let arrayResult = Array2D.init (width + 1) (height + 1) (fun i j -> if i < width && j < height then id)
arrayResult
.fsx(29,45): 错误 FS0001: 类型 'int' 与类型 ''a * 'b * 'c * 'd * 'e -> 'd' 不匹配
对于其他功能,就像我说的,类型推断有效,我可以毫无问题地使用模式匹配
let getMaxCoords =
let x = elements |> Seq.map (fun (_, x, _, _, _) -> x) |> Seq.max
let y = elements |> Seq.map (fun (_, _, y, _, _) -> x) |> Seq.max
x, y
我做错了什么?
【问题讨论】:
-
错误是由
Array2D.init之后的代码引发的,而不是签名。他们抱怨是因为id、startX等是适用于元组而不是整数的函数。你可以写height description并从description获取最后一个元素 -
width是一个函数,所以(width + 1)是一个类型错误。看起来您想将元组参数解构为setArray,即let setArray (id, startX, startY, width, height)) = ...。如果你这样做,你传递给Array2D.init的 init 函数需要在else分支中返回一个值。