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 <[email protected]>
To: Programming forum <[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 <
[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

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

Reply via email to