Send Beginners mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
http://www.haskell.org/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."
Today's Topics:
1. Re: Type classes and synonyms (Isaac Dupree)
2. reverse flow . (Michael P. Mossey)
3. Re: reverse flow . (Michael Mossey)
4. Re: reverse flow . (Tony Morris)
5. Re: reverse flow . (Nicolas Pouillard)
6. combinatorial (Michael P. Mossey)
7. Re: Type classes and synonyms (Stephen Tetley)
8. Re: Type classes and synonyms (Brent Yorgey)
9. Re: Type classes and synonyms (pbrowne)
----------------------------------------------------------------------
Message: 1
Date: Sat, 21 Nov 2009 23:18:22 -0500
From: Isaac Dupree <[email protected]>
Subject: Re: [Haskell-beginners] Type classes and synonyms
Cc: [email protected]
Message-ID: <[email protected]>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Sorry to take offense :-) maybe I was being too modest?
What leads me to conclude that is... Reading several papers about uses
of Arrows and Applicative and Monads for parsing and FRP, being on the
mailing-lists for a few years listening to debates and people struggling
with bits of code, getting a sense of the history of each abstraction
and of how people who use that abstraction daily relate to it. (let's
see if I can name names... Ross Paterson, Conor McBride, maybe Simon
Peyton-Jones..). Experimenting a bit with my own code. Having a vague
sense, through coding Haskell quite a bit, how much it's possible to
condense a piece of code. It is not a conclusion of compulsion, just
that I haven't seen it done better. It seems Arrows are a necessary
abstraction for a couple very particular world-views/paradigms, and
don't fit very well with a lot of other stuff.
So far, I haven't used FRP for anything major, and I've done most
parsing with Parsec (monad-based) and Happy (hmm, it's a preprocessor).
Since I don't have lots of experience with the examples, I didn't want
to claim to understand the abstraction(class) very well. :-)
-Isaac
Tony Morris wrote:
> If you don't yet understand Arrows, then what compels you to conclude
> that there are more idiomatic solutions (than what you don't yet
> understand)?
> Just sayin'
>
> Isaac Dupree wrote:
>> Philip Scott wrote:
>>> Thanks John,
>>>
>>>> Every module can have its own definition for each name, such as the
>>>> operator (+). So in your module (eg. module Main, or module
>>>> DateValueSeries), you can go ahead and define your own (+). The major
>>>> caveat is making sure you don't conflict with the default (+),
>>>> which lives
>>>> in module Prelude, which is normally automatically brought into scope.
>>> That actually quite nicely solves the problem... it feels almost a
>>> little too easy, after spending the evening getting my mind wrapped
>>> up with Arrows :)
>> why has no one mentioned: you most likely don't need to understand
>> Arrows? I'm pretty good with Haskell, and Arrows are still somewhat
>> confusing to me. Why? Most problems I've worked with in Haskell have
>> had more-idiomatic solutions than Arrows. (examples include: Monad;
>> Functor; Applicative; just plain functions; plain old lack of
>> type-class abstraction.) It's not so easy or useful to understand any
>> abstraction/class without using at least two or three useful
>> examples/instances of it first.
>>
>> -Isaac
>> _______________________________________________
>> Beginners mailing list
>> [email protected]
>> http://www.haskell.org/mailman/listinfo/beginners
>>
>
------------------------------
Message: 2
Date: Sat, 21 Nov 2009 23:51:38 -0800
From: "Michael P. Mossey" <[email protected]>
Subject: [Haskell-beginners] reverse flow .
To: [email protected]
Message-ID: <[email protected]>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Can I get some recommendations on defining a function composition
operator that flows in the reverse direction?
Thanks,
Mike
------------------------------
Message: 3
Date: Sun, 22 Nov 2009 00:25:55 -0800
From: Michael Mossey <[email protected]>
Subject: Re: [Haskell-beginners] reverse flow .
To: [email protected]
Message-ID: <[email protected]>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
To clarify, I'm interested in
- what symbols you would choose
- how to set the left/right associativity and precedence
Michael P. Mossey wrote:
> Can I get some recommendations on defining a function composition
> operator that flows in the reverse direction?
>
> Thanks,
> Mike
>
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://www.haskell.org/mailman/listinfo/beginners
------------------------------
Message: 4
Date: Sun, 22 Nov 2009 18:47:34 +1000
From: Tony Morris <[email protected]>
Subject: Re: [Haskell-beginners] reverse flow .
To: Michael Mossey <[email protected]>
Cc: [email protected]
Message-ID: <[email protected]>
Content-Type: text/plain; charset=ISO-8859-1
There is already one.
Prelude Control.Arrow> :type (>>>)
(>>>) :: (Control.Category.Category cat) => cat a b -> cat b c -> cat a c
Michael Mossey wrote:
> To clarify, I'm interested in
>
> - what symbols you would choose
> - how to set the left/right associativity and precedence
>
> Michael P. Mossey wrote:
>> Can I get some recommendations on defining a function composition
>> operator that flows in the reverse direction?
>>
>> Thanks,
>> Mike
>>
>> _______________________________________________
>> Beginners mailing list
>> [email protected]
>> http://www.haskell.org/mailman/listinfo/beginners
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://www.haskell.org/mailman/listinfo/beginners
>
--
Tony Morris
http://tmorris.net/
------------------------------
Message: 5
Date: Sun, 22 Nov 2009 09:49:31 +0100
From: Nicolas Pouillard <[email protected]>
Subject: Re: [Haskell-beginners] reverse flow .
To: Michael P.Mossey <[email protected]>
Cc: beginners <[email protected]>
Message-ID: <1258879747-sup-...@peray>
Content-Type: text/plain; charset=UTF-8
Excerpts from Michael P. Mossey's message of Sun Nov 22 08:51:38 +0100 2009:
> Can I get some recommendations on defining a function composition
> operator that flows in the reverse direction?
There is (>>>) in Control.Category.
--
Nicolas Pouillard
http://nicolaspouillard.fr
------------------------------
Message: 6
Date: Sun, 22 Nov 2009 02:25:45 -0800
From: "Michael P. Mossey" <[email protected]>
Subject: [Haskell-beginners] combinatorial
To: [email protected]
Message-ID: <[email protected]>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
I'm trying to write a combinatorial search algorithm with evaluation,
and kind of stuck. Not sure how to do this.
I'm constructing a musical phrase, which is a list of MidiPitch:
[MidiPitch]
I have an evaluation function that determines the fitness of any given
phrase:
eval :: [MidiPitch] -> Maybe Float
This returns Nothing if the phrase is completely unacceptable.
The idea is to build up a phrase one midi pitch at a time, choosing all
possible next pitches (notes) from a range:
next pitch comes from: [10..90]
Most of the pitches will result in a phrase that evaluates to Nothing,
so the combinatoral "explosion" will be limited.
I'd like to write a function that constructs a phrase of length n, and
in fact will have to return a list of all phrases that have equal scores
of the maximum.
-- <length of output phrase> -> <first pitch> -> <eval func> ->
-- <all tied phrases of best score>
coolFunc :: Int -> MidiPitch -> ([MidiPitch] -> Maybe Float) ->
[[MidiPitch]]
I am stuck on how to write this.
thanks,
Mike
------------------------------
Message: 7
Date: Sun, 22 Nov 2009 11:31:05 +0000
From: Stephen Tetley <[email protected]>
Subject: Re: [Haskell-beginners] Type classes and synonyms
To: [email protected]
Message-ID:
<[email protected]>
Content-Type: text/plain; charset=ISO-8859-1
2009/11/22 Isaac Dupree <[email protected]>:
> Sorry to take offense :-) maybe I was being too modest?
>
> It seems Arrows are a necessary abstraction for a couple very particular
> world-views/paradigms, and don't fit very well with a lot of other stuff.
>
Hello All
I wouldn't go quite as far as saying Arrows are misfits, but in
Isaac's defence, if all you have are pure functions, then arrows are
just a wee bit, erm, boring.
In Philip's original message he happened to be representing his data
as a pair, so second worked fine as a projection/application function,
vis:
*Arrows> second (\x -> "fish") (10,20)
(10,"fish")
But of course it doesn't work as a projection/application function for
triples (sorry I lack a better term for projection/application):
*Arrows> second (\x -> "chips") (10,20,30)
<interactive>:1:0:
Couldn't match expected type `(t, t1, t2)'
against inferred type `(d, b)'
In the expression: second (\ x -> "chips") (10, 20, 30)
In the definition of `it':
it = second (\ x -> "chips") (10, 20, 30)
Nor would it work if Philip had defined his own data type.
Also for pure functions the derived operators (>>^) and (^>>) become
(.), and (<<^) & (^<<) are become reverse composition - which was
sometimes called (##) but now seems categorized as (<<<) .
The code below is a bit superfluous to the discussion, but it does
define the arrow operations for pure functions with the type
constructor simplified to (->), I occasionally do the Arrow
combinators longhand when I can't remember which Arrow combinator does
what.
Best wishes
Stephen
> module ArrowLonghand where
> import Control.Arrow
arr :: (b -> c) -> a b c
fun_arr :: a b c -> (b -> c) where a = (->)
> fun_arr :: (b -> c) -> (b -> c)
> fun_arr f = f
arr's definition is clearly identity, but specialized to functions
> alt_fun_arr :: (b -> c) -> (b -> c)
> alt_fun_arr = id
first :: a b c -> a (b, d) (c, d)
fun_first :: a b c -> a (b,d) (c,d) where a = (->)
> fun_first :: (b -> c) -> (b,d) -> (c,d)
> fun_first f (x,y) = (f x, y)
second :: a b c -> a (d, b) (d, c)
fun_second :: a b c -> a (d,b) (d,c) where a = (->)
> fun_second :: (b -> c) -> (d,b) -> (d,c)
> fun_second f (x,y) = (x, f y)
(***) :: a b c -> a b' c' -> a (b, b') (c, c')
fun_starstarstar :: a b c -> a b' c' -> a (b,b') (c,c') where a = (->)
> fun_starstarstar :: (b -> c) -> (b' -> c') -> (b,b') -> (c,c')
> fun_starstarstar f g (x,y) = (f x, g y)
Funnily enough, (***) is not unlike prod from Jeremy Gibbons
'Pair Calculus':
http://www.comlab.ox.ac.uk/oucl/work/jeremy.gibbons/publications/acmmpc-calcfp.pdf
> prod :: (b -> c) -> (b' -> c') -> (b,b') -> (c,c')
> prod f g = fork (f . fst, g . snd)
(&&&) :: a b c -> a b c' -> a b (c, c')
fun_ampampamp :: a b c -> a b c' -> a b (c,c') where a = (->)
> fun_ampampamp :: (b -> c) -> (b -> c') -> b -> (c,c')
> fun_ampampamp f g x = (f x, g x)
Funnily enough, (&&&) is not unlike fork from the Pair Calculus...
> fork :: (b -> c, b -> c') -> b -> (c,c')
> fork (f,g) a = (f a, g a)
> pair_first :: (b -> c) -> (b,d) -> (c,d)
> pair_first f = f `prod` id
> pair_second :: (b -> c) -> (d,b) -> (d,c)
> pair_second g = id `prod` g
--------------------------------------------------------------------------------
(^>>) :: Arrow a => (b -> c) -> a c d -> a b d
> preCompLR :: (b -> c) -> (c -> d) -> (b -> d)
> preCompLR f g = \x -> g (f x)
(>>^) :: Arrow a => a b c -> (c -> d) -> a b d
> postCompLR :: (b -> c) -> (c -> d) -> (b -> d)
> postCompLR f g = \x -> g (f x)
(^>>) and (>>^) are the same for functions.
-- reverse
(<<^) :: Arrow a => a c d -> (b -> c) -> a b d
> preCompRL :: (c -> d) -> (b -> c) -> (b -> d)
> preCompRL f g = \x -> f (g x)
(^<<) :: Arrow a => (c -> d) -> a b c -> a b d
> postCompRL :: (c -> d) -> (b -> c) -> (b -> d)
> postCompRL f g = \x -> f (g x)
------------------------------
Message: 8
Date: Sun, 22 Nov 2009 10:30:20 -0500
From: Brent Yorgey <[email protected]>
Subject: Re: [Haskell-beginners] Type classes and synonyms
To: [email protected]
Message-ID: <[email protected]>
Content-Type: text/plain; charset=us-ascii
On Sat, Nov 21, 2009 at 09:07:38PM +0000, Philip Scott wrote:
> > The final piece is that (->) is an Arrow, the most basic one but still
> > an Arrow, so if you replace a by (->) in the type of second, you get :
> > second :: (->) b c -> (->) (d, b) (d, c)
> > which is just
> > second :: (b -> c) -> (d, b) -> (d, c)
>
> Ahh I see, very clever! There is method to the madness after all; I should
> never have doubted you Haskell. Thank you for taking the time to explain that
> :)
>
> Do you know of any good discussions/tutorials on Arrows? I've only managed to
> find little snippets here and there
>
> http://www.haskell.org/arrows/
The two tutorials linked from the "Bibliogrphy" section of that page
are very good:
http://www.soi.city.ac.uk/~ross/papers/fop.html
http://www.cs.chalmers.se/~rjmh/afp-arrows.pdf
You may also be interested in reading the "Category" and "Arrow"
sections of the Typeclassopedia:
http://www.haskell.org/sitewiki/images/8/85/TMR-Issue13.pdf
-Brent
------------------------------
Message: 9
Date: Sun, 22 Nov 2009 15:32:07 +0000
From: pbrowne <[email protected]>
Subject: Re: [Haskell-beginners] Type classes and synonyms
To: Felipe Lessa <[email protected]>
Cc: [email protected]
Message-ID: <[email protected]>
Content-Type: text/plain; charset=UTF-8
On Sat, Nov 21, 2009 at 21:08 Felipe Lessa wrote:
> Most definitions, if not all, are just the corresponding free theorems
> (meaning roughly that the definition follows from the type
> because that's the only definition that doesn't have
> undefined's).
Question: Is it correct to paraphrase Felipe's description as follows:
In Haskell the *term theorems for free* means roughly that the
definition of a class, instance or a function follows from the supplied
types because they are the only types that donât have undefined argumens
or undefined return types.
Regards,
Pat
------------------------------
_______________________________________________
Beginners mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/beginners
End of Beginners Digest, Vol 17, Issue 23
*****************************************