Class 如何使一个元组给出一个随机的新元组?

Class 如何使一个元组给出一个随机的新元组?,class,random,f#,mutable,teleport,Class,Random,F#,Mutable,Teleport,我试图采取一个位置(a,b),并通过代码接收一个随机的新位置(a,b)。。我在实现代码时遇到了很大的困难,我得到的是目前为止我最好的尝试 type Teleport (a,b) = inherit Item (a, b, ' ', Color.White, Color.White) override this.FullyOccupy() = true override this.InteractWith (p: Player) = let mutable

我试图采取一个位置(a,b),并通过代码接收一个随机的新位置(a,b)。。我在实现代码时遇到了很大的困难,我得到的是目前为止我最好的尝试

type Teleport (a,b) = 
    inherit Item (a, b, ' ', Color.White, Color.White)
    override this.FullyOccupy() = true
    override this.InteractWith (p: Player) =
        let mutable posX = p.X
        let mutable posY = p.Y
        let rand = System.Random()
        posX <- rand.Next()
        posY <- rand.Next()
类型传送(a,b)=
继承项(a,b',颜色.白色,颜色.白色)
重写此值。fullyOccpy()=true
覆盖此。与交互(p:Player)=
设可变posX=p.X
设可变posY=p.Y
设rand=System.Random()

posX你的代码不起作用的原因是它从不改变玩家的位置<代码>与交互
只需将位置复制到两个局部变量中,并对其进行更新

这就是说,如果你想学习F#,我强烈建议你不要用OO风格编程——你会更乐意使用功能性风格

函数式编程(FP)的一个特点是不变性。对于你的远程传送,这意味着不要改变
玩家的位置,而是用新位置创建一个新玩家

试着按照下面的思路做些事情

type Player = { X: int; Y: int; Name: string }

let teleport player =
    let rand = System.Random()
    { player with X = rand.Next 100
                  Y = rand.Next 100 }
另外,不要试图用一个类来解决每个问题,而是用一个函数;在上面,
teleport
只是一个函数
Player->Player


我真的希望你会喜欢F#;这是一种在.NET上进行FP的好语言。

欢迎来到F#社区。您需要将
let rand=System.Random()
移到
interactivewith
方法之外,因为每次调用
interactivewith
方法时,它可能会初始化相同的随机序列。另外,
posX
posY
变量可能没有帮助。欢迎来到F#社区!这里有一个一般提示:如果您发现自己正在编写面向对象的F#代码,而这不是由于与C#或现有库的互操作,那么您就错了。要么使用F#的函数子集(并体验启发!),要么使用像C#这样的面向对象语言,省去一些麻烦。@Arshia001,我相信你错了。F#是一种多范式语言,而不是一种纯粹的函数式语言。诚然,它首先是功能性的,至少在细节上是如此。不过,在更高的层次上,面向对象编程是F#的重要组成部分,特别是在组织代码方面,它使语言成为在.NET平台上进行有效编程的实用解决方案。@BentTranberg评论可能过于笼统,但至少在这种情况下非常适用。@Arshia001。引用F#的创始人唐·赛姆的话。“F#是一种“函数优先”语言,其中函数式编程是解决大多数编程问题的首选。然而,F#与许多函数式语言的不同之处在于,它具有高度的互操作性,并在必要时包含命令式和面向对象(OO)编程。”。F#(和OCaml)的卖点之一除了能够使用.net库之外,还在于它们不是纯功能性的,并且在需要时支持命令式(和OOP)。