LINUX.ORG.RU

[F#] return a method's object


0

1

а как вернуть объект из метода, принадлежащему этому объекту

type Check (target, f) = 
    static member (+) (c1, c2) =
        c1,c2    
    member this.id = counter.next
    member this.target : Targets = target
    member this.f (target : obj) : obj -> Result = f
    member this.propagate (target) = 
        let res = f target
        res.check <- this //error
        res 

Ответ на: комментарий от vertexua

вот на Java нагуглил, а на F# не смог, не так много инфы пока что по нему

pseudo-cat ★★★
() автор топика
Ответ на: комментарий от vertexua

вопросы, кстати, появились на фоне немного нестандартного использования языка. А в некоторых вопросах явно искался выход из тупика, ака просились альтернативы, а тут ещё тяжелее гуглится

pseudo-cat ★★★
() автор топика

не, я ошибся похоже, тут всё нормально, т.к. очерёдность объявлений типов не позволит использовать тип A в типе B и тип B в типе A одновременно, а this возвращает всё верно:

type A() =
    member this.get () =
        this
извиняюсь

pseudo-cat ★★★
() автор топика
type Result<'a>() =
    [<DefaultValue>] val mutable check: 'a


type Check (target, f) = 
    static member (+) (c1, c2) =
        c1,c2    
    //member this.id = counter.next
    //member this.target : Targets = target
    member this.f (target : obj) : obj -> Result<Check> = f
    member this.propagate (target) = 
        let res = f target
        res.check <- this //error
        res

Так компилится.

Norgat ★★★★★
()
Ответ на: комментарий от pseudo-cat

Тогда надо вот так сделать будет:

type IResultCallable =
    abstract member ResultCall: unit -> int


type Result() =
    [<DefaultValue>] val mutable check: IResultCallable

    member x.T () =
        x.check.ResultCall()


type Check (target, f) = 

    interface IResultCallable with
        member x.ResultCall() = 2*2

    static member (+) (c1, c2) =
        c1,c2    
    //member this.id = counter.next
    //member this.target : Targets = target
    member this.f (target : obj) : obj -> Result = f
    member this.propagate (target) = 
        let res = f target
        res.check <- this //error
        res

Чтобы в Result можно было видеть методы из Check. Т.е. объявить интерфейс заранее.

Norgat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.