f # Переключение между разными версиями параметров / свойств? - PullRequest
1 голос
/ 31 марта 2019

Я пытаюсь определить тип оценки, который отслеживает изменения в его составляющих (составляющими, сообщающими значения, которые его используют, и использованием некоторых пользовательских операторов присваивания), а затем на основе модуса (определенного с помощью оператора 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 (х) = х + 3 var1 § = func (x), var2 $ = func (x), var3 & = func (x)

FUNC (х) = х var1 (intern x), var2 (intern x + 2), var3 (intern x + 2)

Ausgabe func (1): var1-> 1, var2 (изменить: intern x) -> 1, var3-> 4

var3.orderChange var3 (изменить: intern x)

Ausgabe func (1): var3-> 1

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Хотя я не могу ответить на ваш главный вопрос, так как не понимаю, что вы пытаетесь сделать, я могу вам сказать, что у вас есть синтаксическая ошибка в вашем 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

Обратите внимание, что каждое выражение присваивания находится в собственной собственной строке. Заклинивание двух выражений присваивания в одной строке является синтаксической ошибкой: компилятор F # будет читать this.same<-true value<- !reference как «Вызов функции true с параметром value, затем присваивать этот результат this.same», а затем второе Оператор <- вызовет синтаксическую ошибку, поскольку нельзя присвоить два значения одной переменной в одной строке.

Кроме того, учитывая то, как вы написали это выражение match ниже, я уверен, что то, что вы хотели написать в своем методе use2, было if not this.same then ....

Не могу помочь с остальной частью вашего вопроса, но исправление синтаксиса use2 по крайней мере приведет вас к решению проблемы.

0 голосов
/ 10 апреля 2019

Ну, я сделал много неправильно, вот текущая, надеюсь, правильная версия этого проекта.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...