Hey,

thanks for sticking with me ;)

I am, however, a little bit confused now (seems that oo and parallelism are 
the hardest to grasp in julia).

I see that '+' was a bad example. So my error was, that I did not name the 
field correctly, as 'Real' is expecting it to be named 'val'? Jeez, if this 
is true then how is one ever going to 'inherit correctly' from a 
complicated abstract type? There is no way of telling which fileds are 
accessed how by all methods operating on that type x)

So, put simply: What is the Julia way of ensuring that I pass a valid 
probability to my function (figure between 0 and 1). Please do not tell me 
that I am supposed to use @assert statements x)
I would feel that a new type would be the cleanest way to do so?

Best,

Kevin 

On Saturday, 11 June 2016 04:37:32 UTC+2, Jeffrey Sarnoff wrote:
>
> Hi Kevin,
>
> Right questions, different way.
>
> Julia's type system is
>                    of  shared behavior for sharing behaviors.
>                    for specialization as constructive delegation
>
> Real is an abstract type that is supertype to some other abstract types 
>    (Integer, Rational, FloatingPoint, FixedPoint, Probability, ...).
>                                                                           
> [all kinds of]
>
> Each immediate subtype of the Real is an abstract type that is supertype 
> to some type[s].
> For every individual immediate subtype of Real,  that individual is 
> supertype to abstract types and/or/orelse to concrete types.
>                                                                Bool <: 
> Integer <: Real
>                       Union{ Int32, Int64 } <: Signed <: Integer <: Real
>       Union{ Rational{Int32}, Rational{Int64} } <: Rational <: Real
>
>        *note that ..currently.. there is not*      Integer <: Rational <: 
> Real,
>        as ..currently.. all type-based inheritance may associate a 
> concrete type with an abstraction
>             and that abstraction may be elaborated as a long chain linking 
> single supertypes
>         or may associate a concrete type with the concretion of concrete 
> constituents given as its field's types
>         orelse carry some of both manner of information, an enfolding of 
> the elaborative and the constitutive.
>         
> in the early Summer of 2016:
>     Single inheritance of abstract type, and an inheriting abstract type 
> may itself be inherited.
>     One single inheritance of an abstract type by a Concrete type, 
>          and the same, jointly or independently for  each of its 
> concretely typed fields.
>     Any type, abstract or concrete can be defined with one or more 
> parameters (a parameterized type),
>          each distinct value(s of the tuple) of the parameter constitutes 
> a uniquely defined type,
>          there is support for specifying manner of co-action and 
> interaction for parameterized type 'siblings',
>          as there is for specifying the interworking of types and 
> intraworkings of values of a single type.
>
> The architects know how to let abstract types be functionally dispatchable 
> into, just as sqrt(x::Int64) and sqrt(x::Float64) are dispatched into 
> specializations of sqrt() for a Int64 or for a Float64 argument.
> The mechanism is being rethought so that a better, more widely useful way 
> obtain (does this and makes
> it easy to process with and fully support software interface protocols -- 
> and enforce api constraints).
>
> Meanwhile "inheriting from Real" does give the type fallback processing 
> for basic mathematical handling,
> and also encourages some reimplementation, if only to delegate the 
> calculation to the type's value field.
> Multiplying two probabilities as reals gives a result that smaller than 
> either (or equal to smaller of the two),
> which is not what happens to the probability of a win when more skilled 
> players join in the effort.
>
> Enjoy,
>
> Jeffrey
>
>  
>
>
>
>
>   
>     There is desire and activity intending 
>
>
>      
>
>
>
>        which is not the same as red marbles are a color of Marbleness 
> sculpted of a Material inheritance.
>  types 
>        Integers are Real, Rationals are Real  Integers are not Rationals
>
>
> (you are reading how it is 
>
> On Fri, Jun 10, 2016 at 6:15 PM, Kevin Kunzmann <[email protected] 
> <javascript:>> wrote:
>
>> Hey Jeffrey,
>>
>> it's been a while, thx for the answer. I see that this would be working. 
>> However, what about min, max, sin, etc.? I do not want to re-implement all 
>> elementary functions for the Probability type. There must be some way to 
>> inherit the behaviour of the abstract supertype "Real". I guess I am 
>> missing something fundamental about the type system here. 
>>
>> I felt tat something like
>>
>> type Probability{T<:Real} <:Real
>>     p::T
>> end
>>
>> import Base.convert
>>
>> convert{T<:Real}(::Type{T}, x::Probability) = convert(T, x.p)
>> convert{T1<:Real, T2<:Real}(::Type{Probability{T1}}, x::T2) = 
>> Probability(convert(T1, x))
>>
>>
>> should do the job as now any Probability can be converted to any concrete 
>> subtype of Real and "+" shoud be implemented there ;)
>> Very strange, how does Julia handle inheritance at all???
>>
>> Best, 
>>
>> Kevin
>>
>>
>> On Monday, 29 February 2016 23:45:35 UTC+1, Jeffrey Sarnoff wrote:
>>>
>>> Kevin,
>>>
>>> If all that you ask of this type is that it does arithmetic, clamps any 
>>> negative values to zero, and clamps any values greater than one to one, 
>>> that is easy enough. Just note that arithmetic with probabilities usually 
>>> is more subtle than that.
>>>
>>> import Base: +,-,*,/
>>>
>>> immutable Probability <: Real
>>>      val::Float64
>>>
>>>      Probability(x::Float64) = min(1.0, max(0.0, x))
>>> end
>>>
>>> (+){T<:Probability}(a::T, b::T) = Probability( a.val + b.val )
>>> (-){T<:Probability}(a::T, b::T) = Probability( a.val - b.val )
>>> (*){T<:Probability}(a::T, b::T) = Probability( a.val * b.val )
>>> (/){T<:Probability}(a::T, b::T) = Probability( a.val / b.val )
>>>
>>> You need conversion and promotion if you want to mix Float64 values and 
>>> Probability values: 2.0 * Probability(0.25) == Probability(0.5).
>>>
>>> On Sunday, February 28, 2016 at 10:33:07 AM UTC-5, Kevin Kunzmann wrote:
>>>>
>>>> Hey,
>>>>
>>>> I have a (probably) very simple question. I would like to define 
>>>> 'Probability' as a new subtype of 'Real', only with the additional 
>>>> restriction that the value must be between 0 and 1. How would I achieve 
>>>> that 'Julia-style'? This should be possible without having to rewrite all 
>>>> these promotion rules and stuff, is it not? 
>>>>
>>>> Best Kevin
>>>>
>>>
>

Reply via email to