F#Int * Int混乱

时间:2016-03-09 11:13:59

标签: types f# tuples

首先,我想说,我对这种语言完全不熟悉,而且现在对我来说似乎非常奇怪(作为Java / C#用户)。

我目前正在做一个uni项目,我必须使用pathfinding 导航网格(甚至不接近这一点,稍后会处理它),我创建了一个大小为10x10的二维数组但是我发现我可以通过使用像 let mutable position = 0,0 这样的东西来存储我当前的位置,这给了我一种int * int。

这对我来说很好,因为我可以轻松存储我的X和Y位置,但是我遇到了一些问题

1)获取变量中的各个值。 I.E获得我当前的X位置或获得我当前的Y位置

2)添加到此变量,以便我可以在网格中移动。 I.E位置< - 位置+(5,5)

同样,我对这种语言只有少量的经验,所以请保持温和,尽管我似乎很好地掌握了基础知识。

感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:9)

除了Ringil所说的,您可以使用以下方法解构元组:

let xPos, yPos = gridPos

这在F#中更简洁/惯用。

答案 1 :(得分:4)

您可以使用fstsnd函数来获取变量中的各个值(请注意,这只适用于大小为2的元组):

let gridPos = 1, 2
//val gridPos : int * int = (1, 2)
let xPos = fst gridPos
//val xPos : int = 1
let yPos  = snd gridPos
//val yPos : int = 2

对于第二个问题,您可以覆盖加法运算符以允许int*int加法元组,如下所示:

let (+) a b = (fst a + fst b, snd a + snd b)
//val ( + ) : int * int -> int * int -> int * int
let newValue = gridPos + (2,5)
//val newValue : int * int = (3, 7)

那说你通常应该避免F#中的可变状态......