f#在不同版本的参数/属性之间切换?

时间:2019-03-31 08:55:47

标签: f#

我正在尝试定义一个值类型,以跟踪其成分的变化 (通过成分告知使用它的值,并使用一些自定义赋值运算符),然后根据一种方式(由custon运算符定义)进行不同的更新。

我对f#比较陌生,有两个问题:

1)use1:如果值更改为same = false,那么我想返回对该函数的引用,并将其更改为true,但是我似乎使用了错误的match语法。

2)我无法撼动自己的类型比必须的更为复杂的感觉。

我正在尝试定义一个值类型,以跟踪其成分的变化 (通过成分告知使用它的值,以及使用一些自定义赋值运算符) 然后根据使用custon运算符定义的方式进行更新。

type valtype(x) as this = 
     let reference= ref x
     let mutable value = x     
     member val same= true with get, set
     member val uses=[] with get, set    
     member this.chang1=  value<- !reference
     member this.chang2=  this.same<- false
     member val changed= this.chang1          
     member this.use1= fun a->a
     member val used=this.use1

//here the error appears
     member this.use2= if this.same then this.same<-true value<- !reference else fun a->a
    //    match this.same with
    //    |false-> this.same<-true value<- !reference
    //    |true-> fun a->a

     member this.Value
        with get()= this.used value
        and set(c)=value<-c

想要的行为: 伪代码:

func(x)= x + 3 var1§= func(x),var2 $ = func(x),var3&= func(x)

func(x)= x var1(intern x),var2(intern x + 2),var3(intern x + 2)

Ausgabe函数(1): var1-> 1,var2(change:intern x)-> 1,var3-> 4

var3.orderChange var3(change:intern x)

Ausgabe函数(1): var3-> 1

2 个答案:

答案 0 :(得分:1)

虽然由于我不了解您要执行的操作而无法回答您的主要问题,但我可以告诉您use2方法中存在语法错误。这是你写的:

member this.use2= if this.same then this.same<-true value<- !reference else fun a->a

这是正确的写法:

member this.use2=
    if this.same then
        this.same<-true
        value<- !reference
    else fun a->a

注意每个赋值表达式在其 own 行上的方式。将两个赋值表达式卡在一行上是语法错误:F#编译器将this.same<-true value<- !reference读为“用参数true调用函数value,然后将该结果赋值到{{1 }}“ –然后第二个this.same运算符将产生语法错误,因为您不能在一行中将两个值分配给一个变量。

此外,鉴于您是如何编写下面的<-表达式的,因此我确定您要在match方法中编写的内容是use2

对于其余的问题无济于事,但是修复if not this.same then ...的语法至少可以助您一臂之力。

答案 1 :(得分:0)

好吧,我做错了很多,希望这是该项目的当前正确版本。

type Valtype(n:unit ->'T)= 
     let mutable reference= n 
     let mutable value = n()
     let uses= ResizeArray<Valtype>[]
     let get1()=
        value
     //let get2()=
     //   value<-reference()
     //   value
     let mutable get0=fun()->get1()
     let get3()=
        value<-reference()
        get0<-fun()->get1()
        value
     let set1(r:unit ->'T)=
        reference<-r
        for u in uses do
            u.Changed
        value<-r()
     //let set2(r)=
     //   reference<-fun()->r
     let mutable set0=fun(r)->set1(r)
     let mutable modi =0;
     member x.Modi
        with get()= modi
        and set(i)= modi<-i%3
     member x.Subscribe(f)=
        uses.Add(f)
     member x.Unsubscribe(f)=
        uses.Remove(f)
     member x.Value
        with get()=get0()
     member x.Set(r:unit ->'T)=set0(r:unit ->'T)
     member x.Changed=
        match modi with
        |0-> get0<-fun()->get3()`enter code here`
        |1-> value<-reference()
        |_-> ()
     member x.Force= 
        value<-reference()