我正在尝试定义一个值类型,以跟踪其成分的变化 (通过成分告知使用它的值,并使用一些自定义赋值运算符),然后根据一种方式(由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
答案 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()