sHere is the table of verbs from the J TECH Handbook Grade 2.  Would it be 
better to show  ‘[:’  than ‘ ‘ for the modads?

 

]FINAL=:NAMES2 /:~ ALL

┌─────────────┬─┬──┬─┬─────┬─┬─┐
│And          │x│*.│y│LOGIC│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Box          │ │< │y│MONAD│*│*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Copy         │x│# │y│OTHER│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Deal         │x│? │y│ARITH│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Equal        │x│= │y│LOGIC│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Increments   │ │>:│y│MONAD│*│*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Integers     │ │i.│y│MONAD│*│*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│LargerOf     │x│> │y│LOGIC│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│LargerOrEqual│x│>:│y│LOGIC│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│LessOrEqual  │x│<:│y│LOGIC│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│LessThan     │x│< │y│LOGIC│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Match        │x│-:│y│LOGIC│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Maximum      │x│>.│y│ARITH│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Minimum      │x│<.│y│ARITH│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Minus        │x│- │y│ARITH│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│NotEqual     │x│~:│y│LOGIC│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Open         │ │> │y│MONAD│*│*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Or           │x│+.│y│LOGIC│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Plus         │x│+ │y│ARITH│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Reverse      │ │|.│y│MONAD│*│*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Same         │ │] │y│MONAD│*│*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Shape        │x│$ │y│OTHER│ │*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│ShapeOf      │ │$ │y│MONAD│*│*│
├─────────────┼─┼──┼─┼─────┼─┼─┤
│Words        │ │;:│y│MONAD│*│*│
└─────────────┴─┴──┴─┴─────┴─┴─┘

   $FINAL

24 7

 

Linda

 

 

-----Original Message-----
From: [email protected] 
[mailto:[email protected]] On Behalf Of Linda Alvord
Sent: Tuesday, November 18, 2014 6:59 AM
To: [email protected]
Subject: Re: [Jprogramming] a weird thing with multiple : conjunction

 

Here' the ssummary of verbs in the handbook for CJ TECG Grade 2,  Do you think 
it would be better to put [: in for the monadic verbs?

 

   ]ALL=:NAMES,"1 VERBS,"1 GR

┌─────────────┬─┬──┬─┬─────┬─┬─┐

   $ALL

24 7

   ]NAMES2=:,.>NAMES

Integers     

Increments   

Reverse      

Same         

ShapeOf      

Open         

Box          

Words        

Plus         

Minus        

Minimum      

Maximum      

Deal         

Equal        

NotEqual     

LessThan     

LessOrEqual  

LargerOf     

LargerOrEqual

Or           

And          

Match        

Shape        

Copy         

   ]FINAL=:NAMES2 /:~ ALL

┌─────────────┬─┬──┬─┬─────┬─┬─┐

│And          │x│*.│y│LOGIC│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Box          │ │< │y│MONAD│*│*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Copy         │x│# │y│OTHER│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Deal         │x│? │y│ARITH│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Equal        │x│= │y│LOGIC│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Increments   │ │>:│y│MONAD│*│*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Integers     │ │i.│y│MONAD│*│*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│LargerOf     │x│> │y│LOGIC│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│LargerOrEqual│x│>:│y│LOGIC│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│LessOrEqual  │x│<:│y│LOGIC│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│LessThan     │x│< │y│LOGIC│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Match        │x│-:│y│LOGIC│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Maximum      │x│>.│y│ARITH│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Minimum      │x│<.│y│ARITH│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Minus        │x│- │y│ARITH│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│NotEqual     │x│~:│y│LOGIC│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Open         │ │> │y│MONAD│*│*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Or           │x│+.│y│LOGIC│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Plus         │x│+ │y│ARITH│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Reverse      │ │|.│y│MONAD│*│*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Same         │ │] │y│MONAD│*│*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Shape        │x│$ │y│OTHER│ │*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│ShapeOf      │ │$ │y│MONAD│*│*│

├─────────────┼─┼──┼─┼─────┼─┼─┤

│Words        │ │;:│y│MONAD│*│*│

└─────────────┴─┴──┴─┴─────┴─┴─┘

 

 

-----Original Message-----

From:  <mailto:[email protected]> 
[email protected] [ 
<mailto:[email protected]> 
mailto:[email protected]] On Behalf Of Raul Miller

Sent: Tuesday, November 18, 2014 2:57 AM

To: Programming forum

Subject: Re: [Jprogramming] a weird thing with multiple : conjunction

 

What's happening with the ([: u v) : (u v) pattern is this:

 

Every verb gets two (possibly empty) definitions. A monadic definition and a 
dyadic definition. The definition used depends on the context where the verb 
gets used.

 

In a monadic context (like your example here), the monadic definition gets 
used, and the non-functional dyadic definition is ignored.

 

Note also that [: represents a verb with an empty monadic domain and an empty 
dyadic domain.

 

   [: a:

|domain error

 

Note also that you get similar behavior from empty explicit definitions:

   3 :'' a:

|domain error

 

In other words, in J, these can be thought of as being roughly equivalent:

   empty domain

   empty definition

   empty explicit definition

   empty verb

   empty function

 

Restated,

   ([: Volume F) : (Volume F) 3 4 5

is roughly equivalent to

   ([: Volume F) : [: 3 4 5

and also roughly equivalent to

   ([: Volume F) 3 4 5

 

Meanwhile,

   9 ([: Volume F) : (Volume F) 3 4 5

would be equivalent to

   9 [: : ([: Volume F) 3 4 5

and to

   9 ([: Volume F) 3 4 5

 

Or, to take another example (which does not generate an error):

   9 - : - 3 4 5

is equivalent to

   9 [: : - 3 4 5

and to

   9 - 3 4 5

 

(And, internally, there are two collections of definitions associated with the 
'-' primitive - a collection of negation primitives and a collection of 
subtraction primitives. (And, I say collection, because, for example, Roger's 
implementation code which handles 3r4 - 5 is different from his code which 
handles 3.1415 - 2j3.))

 

Thanks,

 

--

Raul

 

 

On Mon, Nov 17, 2014 at 8:52 PM, 'Pascal Jasmin' via Programming <  
<mailto:[email protected]> [email protected]> wrote:

 

> Thanks for your thoughts, Raul.

> 

> Volume is a useless example function.  the key part of the example 

> function is that it takes 3 parameters with the 'l w h' =. y pattern.

> 

> The other functions are generic meant to apply curry to any function 

> that takes multiple parameters (through multi assign pattern).  

> Including dyadic and ambivalent functions.

> 

> even without a multi assignment function, you can still do:

> 

>   1 1 1 + &> curryB ( a:, a:,<4) curryB (3;a:) 10

> 4 11 5

> 

> 

> as a dyadic fork, this is also possible

>   3 (; curryB (1;2) + &> curryB ( a:, a:,<4) curryB (3;a:) ]) 10

> 6 11 6

> (left tine (;) gets resolved as 3;1;2)

> 

>  In terms of currying the leftmost argument, that is easier, and as I 

> understand the basics of Haskell, everything there is currying the 

> left argument until there are no more arguments.

> 

> 

> 

> Your approach to write a simple function that will place further 

> arguments in order also works.  Maybe that gets too complicated for 5+ 
> parameters.

> curryB essentially does that, using a noun as the parameter template.  

> The core of it is the verb rather than conjunction:

> 

> (3;a:,a:,<4) curry 1;2

> ┌─┬─┬─┬─┐

> │3│1│2│4│

> └─┴─┴─┴─┘

> 

> 

> Your approach is more straightforward and efficient.  My approach is 

> more generic though.

> 

> The big mystery to me though is how the compound : sentence manages to 

> work despite a reading that it shouldn't.

> 

> 

> 

> ----- Original Message -----

> From: Raul Miller < <mailto:[email protected]> [email protected]>

> To: Programming forum < <mailto:[email protected]> 
> [email protected]>

> Cc:

> Sent: Monday, November 17, 2014 7:42 PM

> Subject: Re: [Jprogramming] a weird thing with multiple : conjunction

> 

> I'm working through what you have done here, and am trying to 

> understand your reasoning:

> 

> Volume =: 3 : '''Volume is :'', (": l*w*h), '' for length '', (": l) , ''

> width '' , (": w) , '' and height '' , (": h) [''l w h'' =. y'

> 

> 

> This is a verb which only makes sense to use monadically. Also, it's 

> mostly dealing with lists of characters, many of them quoted. I think 

> I'd instead go with:

> 

> 

> Volume =: 3 : 0

> 

>   volume=. ": */y

> 

>   'l w h'=. ":&.> y

> 

>   'Volume is ',volume,', for length ',l,', width ',w,' and height ',h

> 

> )

> 

> 

> The one-liner approach is great for experimenting, but not always so 

> good for other people. (And, I have probably offended on the wrong 

> side of that line, too often).

> 

> 

> Next, we have:

> 

> 

> hook =: 2 : '([: u v) : (u v) '

> itemamend =: 4 : '((2}.$y) $"1 0 x)} y'

> filtermodA =: 1 : 'u itemamend ] ,:  (#inv~ u)'

> curry =: 4 : '(boxopen y) (a: = ]) filtermodA x'

> curryB=: 2 : 'u hook (n&curry)'

> 

> Studying this... the only left argument for 'hook' is Volume, which is 

> monadic. So what this will achieve is needless duplication. 

> Furthermore, what it's used for is not a hook but a hook-like concatenation 
> mechanism.

> So what I think is needed here is a better name. Also, since the 

> monadic/dyadic character of 'hook' is both irrelevant and distracting 

> in this context, I think I'd go with a simpler definition.

> 

> after=: 2 :'([ u v)'

> 

> Or, actually

> 

> after=: @:

> 

> Or, actually, since at this point it's just a primitive, I'd not 

> bother inventing another name for it. I am also tempted to use @ instead of @:

> because the right argument will always have infinite rank, but for 

> this stage of this exercise I will refrain from that approach.

> 

> itemamend =: 4 : '((2}.$y) $"1 0 x)} y'

> filtermodA =: 1 : 'u itemamend ] ,:  (#inv~ u)'

> curry =: 4 : '(boxopen y) (a: = ]) filtermodA x'

> curryB=: 2 : 'u @: (n&curry)'

> 

> And, with that change, the result of

>    Volume curryB ( a:, a:,<4) curryB (3;a:) f.

> is somewhat readable. Looking at it, I expect that I should be able to do

>    Volume curryB ( a:, a:,<4) curryB (3;a:) 5

> 

> but that gives me a domain error. So perhaps a different approach 

> would be good?

> 

> I guess what I think I would want is something which curries the 

> leftmost or rightmost argument in a list. So I would want to generate

>    Volume@(,&4)@(3&,)

> 

> And, honestly, that is good enough as it is. However, if I wanted to 

> get fancy, I could define

> curryR=: 2 :'u@(,&n)'

> curryL=: 2 :'u@(n&,)'

> 

> Note that I am explicitly ignoring the possibility of a left argument 

> for u. If I need a left argument, that's not an obstacle: I can curry 

> ] and use that curried verb to provide the right argument of my dyadic 

> verb. And I think that that approach is fine and good, if I am really 

> trying to define useful modules.

> 

> Of course, another approach would be to define something like:

>    Volume@(3,],4:)

> 

> But if I am going to go that route, I do not think that the abstract 

> concept of "currying" adequately describes what I am doing. So I'd 

> want to come up with a better name as my first step.

> 

> But maybe I have misunderstood what you were driving at here? I seem 

> to be good at that, sometimes.

> 

> Anyways, I hope this helps.

> 

> Thanks,

> 

> --

> Raul

> 

> 

> On Mon, Nov 17, 2014 at 2:35 PM, 'Pascal Jasmin' via Programming < 

>  <mailto:[email protected]> [email protected]> wrote:

> 

> > as a test function

> >

> > Volume =: 3 : '''Volume is :'', (": l*w*h), '' for length '', (": l) , ''

> > width '' , (": w) , '' and height '' , (": h) [''l w h'' =. y'

> >

> >    Volume 3 4 5

> > Volume is :60 for length 3 width 4 and height 5

> >

> > some functions for currying arbitrary parameters

> >

> > hook =: 2 : '([: u v) : (u v) '

> > itemamend =: 4 : '((2}.$y) $"1 0 x)} y'

> > filtermodA =: 1 : 'u itemamend ] ,:  (#inv~ u)'

> > curry =: 4 : '(boxopen y) (a: = ]) filtermodA x'

> > curryB=: 2 : 'u hook (n&curry)'

> >

> > This works: curry height to 4, and then in returned function, curry

> length

> > to 3

> >    Volume curryB ( a:, a:,<4) curryB (3;a:)

> > ([: ([: Volume ((0$0);(0$0);4)&curry) :(Volume 

> > ((0$0);(0$0);4)&curry)

> > (3;0$0)&curry) :(([: Volume ((0$0);(0$0);4)&curry) :(Volume

> > ((0$0);(0$0);4)&curry) (3;0$0)&curry)

> >

> >

> >  calling with remaining parameter (width) 2 returns as desired

> >

> >    Volume curryB ( a:, a:,<4) curryB (3;a:) 2 Volume is :24 for 

> > length 3 width 2 and height 4

> >

> > it also works as a dyadic call

> >

> >   Volume@:] curryB ( a:, a:,<4) curryB (3;a:) 2 Volume is :24 for 

> > length 3 width 2 and height 4

> >   2 Volume@:] curryB ( a:, a:,<4) curryB (3;a:) 2 Volume is :24 for 

> > length 3 width 2 and height 4

> >

> >

> > If you look back to the returned function, it includes 3 : 

> > conjunctions

> to

> > separate monad and dyad calls.  I don't understand how multiple : 

> > works, and if you look closely, only the dyadic sides appear to be 

> > complete expressions that curry both the 4 and the 3

> >

> > actually upon closer inspection of parentheses matching, at the top

> level,

> > only the middle : exists.  On a monadic call the left of that would 

> > be executed, but within that left side, only the right side of : 

> > provides

> the

> > "right" answer.

> > --------------------------------------------------------------------

> > -- For information about J forums see 

> >  <http://www.jsoftware.com/forums.htm> http://www.jsoftware.com/forums.htm

> 

> >

> ----------------------------------------------------------------------

> For information about J forums see  <http://www.jsoftware.com/forums.htm> 
> http://www.jsoftware.com/forums.htm

> ----------------------------------------------------------------------

> For information about J forums see  <http://www.jsoftware.com/forums.htm> 
> http://www.jsoftware.com/forums.htm

> 

----------------------------------------------------------------------

For information about J forums see  <http://www.jsoftware.com/forums.htm> 
http://www.jsoftware.com/forums.htm

----------------------------------------------------------------------

For information about J forums see  <http://www.jsoftware.com/forums.htm> 
http://www.jsoftware.com/forums.htm

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to