[squeak-dev] Smalltalk Arrows a version of Haskell Arrows
Kjell Godo
squeaklist at gmail.com
Wed Feb 8 21:04:54 UTC 2017
I think that in Smalltalk a
Haskell Arrow
is just a 1 input valuable plus some composition methods
like
>>into: = return a function composition ,
( f into: g ) = [ :x | g value: ( f value: x ) ]
>>pair: = return a do both functions and return a size 2 Array ,
( f pair: g ) = [ :x | Array with:( f value: x )with:( g value: x ) ]
>>binOp: = return a binary op on Array ,
( p binOp: b ) = [ :array | b value:( p value:( array first ) )
value:( p value:( array
second ) ) ]
>>doAt1 = return a do function on p's Array at:1 and return Array ,
( p doAt1 ) = [ :array | array at:1put:( p value: ( array first ) ) ;
yourself ]
>>doAt2 = return a do function on Array at:2 and return Array ,
( p doAt2 ) = [ :array | array
at:2put:( p value: ( array
second ) ) ;
yourself
]<---------------[ is faster ]
( p doAt2 ) = ( p swap into: doAt1 ) swap <---------[ it's shorter
it's simpler ]
>>swap = return a do p and return Array transposed
( p swap ) = [ :x | ( p value: x ) reverse ]
etc ( a 1 input valuable is anything that responds to #value: )
Haskell seems to get a lot of mileage out of this
kind of Category theoretical
function composition
and no doubt the Haskell type system aids in this
and practically Maybe demands it
and makes it really convoluted
they rebelled against lispy simplicity
in order to make it simple in order to not to scare the
newbies
they dumped all the parens overboard
replaced them all with a complicated set of precedent rules
so now you got to have a parser in your head
to read the stuff
and if you don't where you gonna get one
is that guy going to parse it for you i don't think so
which far from making it easier
for anybody but a rank newbie a ranking newbie got to
impressem
this induced parserhead requirement on human
Haskell code readers
instead of making it any easier makes it really really hard out
on the deep end
of the pool there is a tremendous drop off a under water
cliff
where newbies who reach puberty begin hanging thenselves
out to dry
which doesn't really work cause they keep getting all
wet
and this may well be a great resistance to
Haskell uptake
and seems to be an endless source of
confusion contusion and discussion as meetup people's
personal Haskell brain pan parsers shift in and out
of true conformity to the standard
as we speak as we keep on speaking
and
No wait-
s abound
but the people who got a Haskell parser in they head
they say oh no I'm not going through That again
No you get a parser in your head
or you're out
but i regress -digress!
The Smalltalk runtime type system makes it a lot
simpler to see what is going on
so i wonder
what effect this kind of function composition
style could have on Smalltalk code
Where maybe you have a bunch of Methods
that just return 1 input valuables
( [ :x | ... ] , SomeFunctionClass>>value: , etc )
which then get turned into Arrows
and get categorically indubitably functionally composed
who knows what could happen
the Objects themselves in this functional Smalltalk style could be
mostly empty except for accessors
and then stateless Traits
could be the functions
or there could be separate stateless functional Classes
that have the stateless functions
which could be pluggable
on multiple different applicable Object Classes
( kind of a pluggable multiple inheritance thing going on )( ? )
because
supposedly
then
you can make new functions
by just using
very simplified
composition expressions
as in the short example above ( p doAt2 ) = ^( p swap into:
doAt1 ) swap
as opposed to having to know a lot about
all the inputs and all about how the sends are supposed to fit
together
involving lots of looking things up over and over
the composition combinators do all that
for you
or so the combinator propaganda goes
but is it really true
or do you have to know just as much
or more to actually get the
function combinators to work
or do you have to finally wise up
and get smart
and stop fooling around with writing yet
another monad
tutorial(s) just like all the other ranking newbies and get
serious
and write a brain pan parser compiler
and become a first class tenderfoot
And now you're much worse off
than before
in the time spent column
and you don't even know it
that's the sad part
because the Maybe she's elegance column is calling sirens
calling
clouding your mind with foggy fogged up window pain desires
and you don't even know which end is up anymore
and you want some of that categorical shit
they're having at the big people's table
so is it worth it
does it work as advertised
or is it just to be deride
i wonder
But i would like it if a
Smalltalk Arrow
could explain itself
So an Arrow is just an Object that contains a 1 input valuable
and a BinaryArrow isA Arrow and contains 2 Arrows
so Arrow>>explainYourself
returns
an Array tree of oneInputValuable source code Strings
which describe how
the Arrow works because otherwise it's just a great big mystery
Arrow
hasA oneInputValuable <---[ a one input function ]
BinaryArrow isA Arrow
hasA firstArrow
secondArrow
But the
BlockClosure>>into: >>pair: >>binOp: >>at1Do >>at2Do >>swap etc
and
the
Object>>into: >>pair: >>binOp: >>at1Do >>at2Do >>swap etc
work too
maybe quicker
or
( anArrow asValuable ) <---[ which gets rid of all the explanation
bits ]
<---[ couldn't the Smalltalk
compiler optimize this
functional as it sits ]
Haskell is very big on Immutablility
But in Smalltalk exscpecially in the GUI making everything immutable
just doesn't seem right
because you've got all these Objects which are sitting in this web
and they are taking inputs from god knows everywhere
and broadcasting them back out again
so you have the idea of a web of important Objects
with not so important contents which are coming and going
and recording them all all that and saving them all
for posterity just don't seem right
dependent Objects that are interested can note the changes
In Smalltalk when i want an immutable copy of an
( Object o ) where o might be changing i just get
( o copy ) or ( o deepCopy ) to take a snapshot of o
but then you have to keep track of when to take a snapshot
it's true
But Smalltalk can have a
Immutable Class
maybe a subClass of ProtoObject?
to make mixins Object Class complete?
where an ( Immutable m ) is on another ( Object o )
Immutable
hasA object <---[ object = o ]
and m forwards all Messages to o after
making a copy of itself m and o and returning the copy of itself m
unless
( ( o aMessage ) ~= o ) in which case
( ( o aMessage ) asImmutable ) is returned
then you don't have to keep track of when to copy m
but there could be any amount of copying
going on
so hopefully it's not too much
Maybe Object>>immutableCopy might be good which
could be called if it is defined? Maybe not Probably not
so hopefully the programmer can tell when
copy is Immutable enough and
when an Immutable wrapper is ok good
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20170208/0519ab05/attachment.html>
More information about the Squeak-dev
mailing list
|