so wise! thanks for those clarification.

I did not deeply understand why it is called an identity func, and why it 
has to be this signature.
It seems so narrowed to a specific case, makes me unhappy.

Now, i realized that even if <t>, for some specific cases, seems to solve 
some situations,
it won t be enough to implement the kind of things i presented, 
function composition (do -> to composition).

My example was tooooo simple.

A better func to think about is *mustNotErr*.

mustNotErr is not implementable using <t>, but lets take a look what he d 
be,

func mustNotErr(f func() (<t>, error)) func() (<t>) {}

In plain text, it is a func that takes in parameter a func and returns a 
func.

but if you take some realistic example you ll get something like

func W() (X, error){}
func W1(a A, b *B) (Y, X, error){}

And now we can observe that size, positions, and types 
of the delayed func IO/parameters are the differences 
that are not matched in my previous declaration of mustNotErr.

mustNotErr takes no parameter, returns only 2 parameters
f() (A,B) -> matches W, but not W1.

But, intuitively we feel that W and W1 can be factorized to something like 
this,
a func                                      func(
with any input parameters           ...
,                                               ) (
returns any parameters,              ...
followed,                                    ,
by a traling error                          error
                                                )

yeah ?

Using that definition, let s see what it might look likes,

mustNotErr := func(f <t:func(...)(..., error)>) *???* {
 return func(params ...Parameters) *???* {
    ...ret, err := f(params...)
    if err != nil {
        panic(err)
    }
    return ret...
 }
}

Where Parameters{Value,Type}
Where "...,error" ~~ any front parameters until error
Where "...ret, err :=" ~~ any front parameters until error
Where "return ret..." ~~ any values in []Parameters

The problem now is about the type of the returned func,
it is not <t> anymore, because the error return parameter was removed,
on the other hand, as a declarer we dont know enough about f, to return a 
complete function,
it literally is func(...)(...)

But func(...)(...) is not a type a receiver can consume....

At that point, some sort of templating is required, indeed,
or what, partial types ? looks bad...


On Thursday, July 20, 2017 at 10:25:30 PM UTC+2, Jesper Louis Andersen 
wrote:
>
> On Mon, Jul 17, 2017 at 11:07 AM <mhh...@gmail.com <javascript:>> wrote:
>
>> does it make sense to consider a "value type of any type that carries out 
>> its input type" ?
>>
>
> Yes. This is called a "universal" and is related to the concept of 
> parametrization by J. Reynolds.
>
> Your 'do' function is often called 'id' for the obvious reason that it is 
> the identity function. In SKI logic it is the I combinator. If we annotate 
> the type as you would in type theory, you would write something like
>
> id : (T : Type) -> T -> T
> id t x = x
>
> to say that the function can be instantiated with any type 'T' you desire. 
> The actual implementation of 'id' takes two parameters. First it takes the 
> desired type and then it takes the parameter and returns it. Writing 'id 
> Int' is a partial invocation. It "plugs in" the T and yields a function of 
> type 'Int -> Int'. Likewise, 'id String' plugs in strings in the position. 
> Interestingly, Reynolds showed that if the function 'id' is to work for 
> *any* type T at the same time, it *must* have the above implementation. No 
> other implementation is valid. This is the concept of parametrization. Even 
> better, the type T can be a type outside of the type system of the 
> programming language!
>
> But do note there is no way a function such as 'id' can manipulate the 
> contents in any way. It is allowed to pass a (generic) data value, but it 
> is not allowed to scrutinize said data value at all.
>
> The next question is if you can add constraints to the type. In 
> particular, you want access to the stringer interface in order to grab a 
> string representation of the values. That is, you want to allow any type T 
> for which it holds that it is a member of the Stringer interface.
>
> exclaim : Show a => a -> String
> exclaim x = show x ++ "!"
>
> The exclaim function is one such function example. It accepts any type 'a' 
> for which the "Show" interface is implemented. Then it prints the value and 
> adds an exclamation mark at the end of the string. It works for any type 
> implementing the "Show interface".
>
> The above code works in Idris, or Haskell with minor modifications, so the 
> generality is definitely doable.
>
> The price you pay for these types of generalizations tend to be 
> compilation time or slower execution time. It is one of the places where I 
> tend to disagree with the Go authors: I think the added compilation time is 
> worth paying for the added expressive power in the language. I also think 
> you can make compilation of generics really fast, so the added compilation 
> time is somewhat manageable (and only paid if you actually invoke a generic 
> construction).
>
>
>  
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to