Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types F#Int*Int混淆_Types_F#_Tuples - Fatal编程技术网

Types F#Int*Int混淆

Types F#Int*Int混淆,types,f#,tuples,Types,F#,Tuples,首先,我想说的是,我对这种语言是完全陌生的,到目前为止,它对我(作为Java/C用户)来说似乎非常陌生 我目前正在做一个uni项目,在这个项目中,我必须使用寻路来导航网格(甚至不接近这一点,稍后会处理它),我已经创建了一个大小为10x10的2d数组,但是我发现我可以使用让可变位置=0,0之类的方法来存储我的当前位置,这给了我一种int*int类型 这对我来说似乎很棒,因为我可以轻松地存储我的X和Y位置,但是我遇到了一些问题 1)获取变量中的各个值。即获取我当前的X位置或获取我当前的Y位置 2)添

首先,我想说的是,我对这种语言是完全陌生的,到目前为止,它对我(作为Java/C用户)来说似乎非常陌生

我目前正在做一个uni项目,在这个项目中,我必须使用寻路来导航网格(甚至不接近这一点,稍后会处理它),我已经创建了一个大小为10x10的2d数组,但是我发现我可以使用让可变位置=0,0之类的方法来存储我的当前位置,这给了我一种int*int类型

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

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


2)添加到此变量,以便我可以在网格中移动。也就是说,position您可以通过使用类似的
fst
snd
函数来获取变量中的各个值(注意,这仅适用于大小为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#…

中使用可变状态。除了Ringil所说的,您还可以使用以下方法解构元组:

let xPos, yPos = gridPos

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

类型
int*int
意味着该类型是两个元素都具有类型
int
@MarkSeemann的类型,因此我认为我真的不应该使用元组进行当前定位。你能建议一些更合适的吗?为什么不能?你怎么会这样想呢?我总是这样声明自己的Vector2类型来解决这个问题:
typevector2={x:int;y:int}
。通过这种方式,你可以a)使用静态方法重载*和b)创建一个操作符来构造向量(比如说,@),我看到了非常有用的信息,但我忍不住认为这不是我应该采取的方法,因为简单地保存位置数据似乎效率不高。我认为在元组中保存位置数据没有任何问题。但是让元组可变是一种禁忌……你能解释一下为什么让元组可变是不明智的吗?在这个应用程序中,这似乎是必要的,因为稍后我将不得不进行一个循环,以主动地改变位置(通过寻路),这就是问题所在。通常不需要在F#中执行循环,因为可以使用递归。如果state很重要,那么应该在递归函数中作为参数传递state。本文以一个简单的例子(阶乘)为例,简要说明了如何实现这一点:太棒了,非常感谢您的帮助。我会仔细阅读一下,试着弄清楚我希望如何继续。作为奖励,你可以在不能像函数参数那样使用
snd
的地方这样做
let test=fun a(x,y)->x*y
,然后
test“忽略这个”(1,2)
let xPos, yPos = gridPos