I second the recommendation to look at Haste. It's what I would pick for a
project like this today.
In the big picture, Haste and GHCJS are fairly similar. But when it comes
to the ugly details of the runtime system, GHCJS adopts the perspective
that it's basically an emulator, where
.
On Tue, Jul 9, 2013 at 11:46 AM, Aleksey Khudyakov
alexey.sklad...@gmail.com wrote:
On 08.07.2013 23:54, Chris Smith wrote:
So I've been thinking about something, and I'm curious whether anyone
(in particular, people involved with GHC) think this is a worthwhile
idea.
I'd like to implement
Oh, never mind. In this case, I guess I don't need an extension at all!
On Tue, Jul 9, 2013 at 1:47 PM, Chris Smith cdsm...@gmail.com wrote:
Oh, yes. That looks great! Also seems to work with OverloadedStrings
in the natural way in GHC 7.6, although that isn't documented.
Now if only
to add 'import Prelude' to the top of their
code. Am I missing something?
On Tue, Jul 9, 2013 at 1:51 PM, Chris Smith cdsm...@gmail.com wrote:
Oh, never mind. In this case, I guess I don't need an extension at all!
On Tue, Jul 9, 2013 at 1:47 PM, Chris Smith cdsm...@gmail.com wrote:
Oh, yes
for the suggestion!
On Jul 9, 2013 4:20 PM, Aleksey Khudyakov alexey.sklad...@gmail.com
wrote:
On 10.07.2013 01:13, Chris Smith wrote:
Ugh... I take back the never mind. So if I replace Prelude with an
alternate definition, but don't use RebindableSyntax, and then hide
the base package, GHC still
So I've been thinking about something, and I'm curious whether anyone
(in particular, people involved with GHC) think this is a worthwhile
idea.
I'd like to implement an extension to GHC to offer a different
behavior for literals with polymorphic types. The current behavior is
something like:
, Jul 8, 2013 at 12:54 PM, Chris Smith cdsm...@gmail.com wrote:
So I've been thinking about something, and I'm curious whether anyone
(in particular, people involved with GHC) think this is a worthwhile
idea.
I'd like to implement an extension to GHC to offer a different
behavior for literals
of the internet.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
On Apr 28, 2013 6:42 PM, Alexander Solla alex.so...@gmail.com wrote:
I think that much has to do with the historical division in computer
science. We have mathematics on the right hand, and electrical engineering
on the wrong one.
I've been called many things, but electrical engineer is a new
Oops, forgot to reply all.
-- Forwarded message --
From: Chris Smith cdsm...@gmail.com
Date: Apr 27, 2013 12:04 PM
Subject: Re: [Haskell-cafe] Markdown extension for Haddock as a GSoC project
To: Bryan O'Sullivan b...@serpentine.com
Cc:
I don't agree with this at all. Far more
in mailing list threads.)
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
Mateusz Kowalczyk fuuze...@fuuzetsu.co.uk wrote:
I know that this year's projects aren't up
yet
Just to clarify, there isn't an official list of projects for you to choose
from. The project that you purpose is entirely up to you. There is a list
of recommendations at
On Sun, Dec 30, 2012 at 8:51 AM, David Thomas davidleotho...@gmail.comwrote:
Jon's suggestion sounds great.
The bike shed should be green.
There were plenty of proposals that would work fine. `case of` was great.
`\ of` was great. It's less obvious to me that stand-alone `of` is never
It would definitely be nice to be able to work with a partial Category
class, where for example the objects could be constrained to belong to a
class. One could then restrict a Category to a type level representation
of the natural numbers or any other desired set. Kind polymorphism should
make
Ketil Malde ke...@malde.org wrote:
The point of the point is that neither of these are translations of
literary works, there is no precedence for considering them as such, and
that reading somebody's work (whether literary or source code) before
writing one's own does not imply that the
Michael Snoyman mich...@snoyman.com wrote:
That said, it would be great to come up with ways to mitigate the
downsides of unbounded polymorphism that you bring up. One idea I've
seen mentioned before is to modify these extension so that they target
a specific instance of IsString/IsList, e.g.:
On Sun, Sep 2, 2012 at 9:40 AM, timothyho...@seznam.cz wrote:
The thing is, that one ALWAYS wants to create a union of types, and not
merely an ad-hock list of data declarations. So why does it take more code
to do the right thing(tm) than to do the wrong thing(r)?
You've said this a few
I am tentatively in agreement that upper bounds are causing more
problems than they are solving. However, I want to suggest that
perhaps the more fundamental issue is that Cabal asks the wrong person
to answer questions about API stability. As a package author, when I
release a new version, I
Twan van Laarhoven twa...@gmail.com wrote:
Would adding a single convenience function be low or high risk? You say it
is low risk, but it still risks breaking a build if a user has defined a
function with the same name.
Yes, it's generally low-risk, but there is *some* risk. Of course, it
Whoops, my earlier answer forgot to copy mailing lists... I would love to
see \of, but I really don't think this is important enough to make case
sometimes introduce layout and other times not. If it's going to obfuscate
the lexical syntax like that, I'd rather just stick with \x-case x of.
On
It turns out I'm filling in for a cancelled speaker at a local open
source user group, and doing a two-part talk, first on Haskell and
then Snap. For the Haskell part, I'd like a list of current places
the language is used in industry. I recall a few from Reddit stories
and messages here and
Oops, forgot to reply-all again...
-- Forwarded message --
From: Chris Smith cdsm...@gmail.com
Date: Fri, May 4, 2012 at 8:46 AM
Subject: Re: [Haskell-cafe] Problem with forall type in type declaration
To: Magicloud Magiclouds magicloud.magiclo...@gmail.com
On Fri, May 4, 2012
Paolo,
This new pipes-core release looks very nice, and I'm happy to see
exception and finalizer safety while still retaining the general
structure of the original pipes package. One thing that Gabriel and
Michael have been talking about, though, that seems to be missing
here, is a way for a
Hmm, tough to answer without more to go on. I think if I were in your
shoes I'd ask myself where I'm most happy outside of programming. A lot of
good entry level open source work involves combining programming with other
skills.
Are you an artist? Have a talent for strong design and striking
Jerzy Karczmarczuk jerzy.karczmarc...@unicaen.fr wrote:
Le 26/03/2012 02:41, Chris Smith a écrit :
Of course there are rings for which it's possible to represent the
elements as lists. Nevertheless, there is definitely not one that
defines (+) = zipWith (+), as did the one I was responding
simpler than the code in the
question, and that defining a Num instance is possible, but a bad idea
because there's not a canonical way to define a ring on lists. The
rest of this seems to have devolved into quite a lot of bickering and
one-ups-manship, so I'll back out now.
--
Chris Smith
that obeys the
laws, so it's better to write no instance at all.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
Jerzy Karczmarczuk jerzy.karczmarc...@unicaen.fr wrote:
Le 26/03/2012 01:51, Chris Smith a écrit :
instance (Num a) = Num [a] where
xs + ys = zipWith (+) xs ys
You can do this in the sense that it's legal Haskell... but it is a bad idea
[...]
It MIGHT be a ring
If you are willing to depend on a recent version of base where Num is no
longer a subclass of Eq and Show, it is also fine to do this:
instance Num a = Num (r - a) where
(f + g) x = f x + g x
fromInteger = const . fromInteger
and so on.
___
.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
than I do.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
about if you're willing to depend on a recent version
of base. Effectively, this means requiring a recent GHC, since I'm
pretty sure base is not independently installable.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http
, but just because
re-implementing the whole front end of a compiler for even a limited
but useful subset of Haskell is a ludicrously ambitious and risky
project for GSoC.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http
implementations than even six or seven at a student
project level.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
we should ideally call them just
effects. But since so many other languages use functions to
describe effectful actions, the term has stuck. So pretty much when
someone talks about side effects, even in Haskell, they means stateful
interaction with the world.
--
Chris Smith
, lazy evaluation
(which can be seen as a controlled benign mutation) is enough to
recover the optimal asymptotics.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
code without ensure.
It will then be interesting to see how that compares to Gabriel's
approach, which at this point we've heard a bit about but I haven't
seen.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org
)
Or, you may want to use a Maybe type for the return... which would
mean there *is* a Nothing value you can return:
tmp:: [(Int, Int)] - Int - Maybe (Int, Int)
tmp (x:xs) y
| y == 1 = Just x
| y 1 = tmp xs (y-1)
tmp [] y = Nothing
Does that help?
--
Chris Smith
Oh, and just to point this out, the function you're writing already
exists in Data.List. It's called (!!). Well, except that it's zero
indexed, so your function is more like:
tmp xs y = xs !! (y-1)
___
Haskell-Cafe mailing list
= case drop (y-1) xs of
[] - (0,0)
Just (x:_) - x
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
that law hold,
and I *think* you'd even keep associativity in the process so you
would technically have a category again. But this hints to me that
there is some *other* law you should expect to hold with regard to the
interaction of Category and Monad, and now that is being broken.
--
Chris
want the unawait to occur.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
can be exhausted, but when it is, idP will
await input, which will immediately terminate the (idP p) pipe,
producing the result from q, and ignoring p entirely.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org
).
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
, looks like idP is still the identity.
Of course, the real reason (aside from the fact that you can check and
see) is that forP isn't definable at all in Gabriel's pipes package.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http
My first impression on this is that it seems a little vague, but
possibly promising.
I'd make it clearer that you plan to contribute to the existing UHC
stuff. A first glance left me with the impression that you wanted to
re-implement a JavaScript back end, which would of course be a
non-starter
On Dec 31, 2011 8:19 AM, Yves Parès limestrael+hask...@gmail.com wrote:
-- The plain Maybe type
data Maybe a = Just a | Nothing
-- The MaybeMonad
newtype MaybeMonad a = MM ( () - Maybe a )
That's what using Maybe as a monad semantically means, doesn't it?
I'd have to say no. That Maybe
.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
at is that we don't have a formal model of what an
IO action means. Nevertheless, we know because f is a function, that
when it is applied twice to the same argument, the values we get back
(which are IO actions, NOT integers) are the same.
--
Chris Smith
be to define the notion of
doing an action more precisely.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
, the sort of thing meant by the C programming
language by that word. Uncomputable is a very poor word for that idea.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
function on
non-bottom values. Not perfect, but close.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
NOT isolate in the type system. But that's for another time.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
or not is a
matter of your taste); it's directly relevant to day to day programming
in Haskell.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
as trivial as inlining by the compiler (see the ugly NOINLINE
annotations often used with unsafePerformIO tricks for initialization
code for an example).
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman
the effect it
describes haven't been performed. It's exactly that distinction -- the
refusal to conflate evaluation with performing effects -- that is
referred to when Haskell is called a pure language.
--
Chris Smith
___
Haskell-Cafe mailing list
about the RTS implementation, which is of course plenty
effectful and involves lots of destructive updates. It's about the
language semantics.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman
anything except those
expressions that deal explicitly with that type. THAT is why it's so
crucial that values of IO types are just ordinary values, not some kind
of magic thing with special evaluation rules tailored to them.
--
Chris Smith
___
Haskell
for that.
I've never been able to get wx to build, but gtk works fine. Others
(mostly those using macs) report the opposite.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
On Sun, 2011-11-06 at 17:25 -0500, Heller Time wrote:
unless the machine running the program using time-recurrence was traveling
across timezones (and the system was updating that fact)
Note that this is *not* an unusual situation at all these days. DST was
already mentioned, but also note
On Sat, 2011-10-01 at 02:16 -0700, Fred Smith wrote:
In seems to me that in cloud haskell library the function's closures
can be computed only with top-level ones, is it possible to compute
the closure at runtime of any function and to send it to another host?
The current rule is a bit overly
On Tue, 2011-09-27 at 00:29 -0700, Donn Cave wrote:
It doesn't appear to me to be a technicality about the representation -
the value we're talking about excluding is not just represented as
greater than 0.3, it is greater than 0.3 when applied in computations.
Sure, the exact value is greater
On Tue, 2011-09-27 at 09:23 -0700, Donn Cave wrote:
I think it's more than reasonable to expect
[0.1,0.2..0.5] == [0.1,0.2,0.3,0.4,0.5]
and that would make everyone happy, wouldn't it?
But what's the justification for that? It *only* makes sense because
you used short decimal literals.
isn't in the list. You don't need
approximate behavior for those types, and if you really mean
takeWhile (= 20) [1,3..], then you should probably write that, rather
than a list range notation that doesn't mean the same thing.
--
Chris Smith
___
Haskell
On Tue, 2011-09-27 at 12:36 -0400, Steve Schafer wrote:
[0.1,0.2..0.5] isn't the problem. The problem is coming up with
something that not only works for [0.1,0.2..0.5], but also works for
[0.1,0.2..1234567890.5].
A good rule of thumb: For every proposal that purports to eliminate
having to
On Mon, 2011-09-26 at 18:53 +0200, Lennart Augustsson wrote:
If you do [0.1, 0.2 .. 0.3] it should leave out 0.3. This is floating
point numbers and if you don't understand them, then don't use them.
The current behaviour of .. for floating point is totally broken, IMO.
I'm curious, do you
On Mon, 2011-09-26 at 18:52 +0300, Yitzchak Gale wrote:
Chris Smith wrote:
class Ord a = Range a where...
Before adding a completely new Range class, I would suggest
considering Paul Johnson's Ranged-sets package:
Well, my goal was to try to find a minimal and simple answer that
doesn't
?
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
Would it be an accurate summary of this thread that people are asking
for (not including quibbles about naming and a few types):
class Ord a = Enum a where
succ :: a - a
pred :: a - a
fromEnum :: a - Int(eger)
toEnum :: Int(eger) - a
-- No instance for Float/Double
class Ord a =
to add the new methods to RealFloat (breaking
on the bizarre off chance that someone has written a nonstandard
RealFloat instance), or add a new IEEE type class.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http
On Fri, 2011-09-23 at 11:02 +1200, Richard O'Keefe wrote:
I do think that '..' syntax for Float and Double could be useful,
but the actual definition is such that, well, words fail me.
[1.0..3.5] = [1.0,2.0,3.0,4.0] Why did anyone ever think
_that_ was a good idea?
In case you meant
On Mon, 2011-09-19 at 22:09 -0700, Evan Laforge wrote:
Then I tried switching to a fixed point format, and discovered my
mistake. Enum is supposed to enumerate every value between the two
points, and the result is memory exhaustion.
I'm not sure where you read that Enum is supposed to
On Tue, 2011-09-20 at 17:39 +0200, Ketil Malde wrote:
You forgot confusing?
I didn't forget it; whether it's confusing or not depends on the
perspective you're coming from. The kids in my beginning programming
class are using Enum (via the list syntactic sugar) on Float and don't
get
On Tue, 2011-09-20 at 15:28 -0400, Casey McCann wrote:
I actually think the brokenness of Ord for floating point values is
worse in many ways, as demonstrated by the ability to insert a value
into a Data.Set.Set and have other values disappear from the set as
a result.
Definitely Ord is
On Tue, 2011-09-20 at 16:22 -0400, Jake McArthur wrote:
This makes me wonder if maybe the reason this discussion is happening
at all is that we don't have a well-defined meaning for what Enum
*is*.
Certainly, we don't have a type-independent definition for Enum. I'm
not sure whether it's
, so let's just delete it
without regard to how useful it is is very short-sighted.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
On Wed, 2011-09-21 at 00:04 +0200, Ketil Malde wrote:
If Haskell defined list syntax in terms of something that's not called
Enum, that would be fine. Renaming is never all that big a deal. But
the list sugar is a big deal, and I don't think there's any point at all
in leaving the list
are bottom, and a single layer above it in the
information ordering.
If I've misunderstood the question, my apologies... I haven't actually
been reading this thread.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http
will remain open for the next week, after which I'll choose a
date so we can all start planning.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
projects at the same time.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
implement that only
once. Plenty of places in base do this, especially for instances.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
:: a - b - c
instance Tuple (a - b, a - c) a (b,c) where
tuple (f,g) x = (f x, g x)
and so on... You'll need fundeps (or type families if you prefer to
write it that way), and probably at least flexible and/or overlapping
instances, too, but of course GHC will tell you about those.
--
Chris
I'm curious why you wanted a finger tree without the Monoid instance...
if you need a different Monoid instance, you can probably simplify your
code significantly by using a newtype wrapper around Seq rather than
re-implementing it.
--
Chris Smith
- refuse
to engage.
I don't agree with this. It's the most natural thing in the world to
listen to an answer and then try to figure out whether the speaker knows
what they are talking about or not. Those who expect us to forego that
step aren't really engaged in mathematics any more.
--
Chris
Okay, I should have waited until morning to post this... so actually,
things still work fine when I build without profiling. However, when I
build with profiling, I get the segfault. I'm guessing either I need to
set different dynamic flags with the profiling build to match the
options of the
'?
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
on an expression I've constructed to retrieve it.
Any ideas what's going on? Am I missing a step?
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
anything I'm doing obviously wrong here, but I'm not at all
familiar with GHC's build process, so I'm hoping someone can pipe up and
point out the obvious stuff I've missed.
Any ideas?
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
On Mon, 2011-08-15 at 03:34 -0600, Chris Smith wrote:
Can anyone tell me what I'm doing wrong with the GHC API?
Answering my own question: I was passing OneShot as the mode instead of
CompManager. I still don't understand why, but random trial and error
to the rescue! That solves the problem
package is a bit heavyweight for that; it
exports four new modules for what is really a very simple concept!
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
On Fri, 2011-08-12 at 11:44 -0500, austin seipp wrote:
2) I noticed `-fvia-C` has now gone away [...]
I can't forsee the potential performance ramifications, but frankly
-fvia-C has been deprecated/not-advised-for-use for quite a while now,
and I wonder how many of these programs just have
better (more specific).
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
that default
exists for other tyoes, or if its specific to Integer.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
n = numerator r
k = log2 d
log2 1 = 0
log2 n | even n n 1 = 1 + log2 (n `quot` 2)
| otherwise = error log2 not an integer
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe
at all comes in
the form of libraries. One of the nice things about Haskell is how
little has to be built in to the language.
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
On Sat, 2011-07-30 at 15:07 -0700, KC wrote:
A language that runs on the JVM or .NET has the advantage of Oracle
Microsoft making those layers more parallelizable.
On top of the answers you've got regarding whether this exists, let me
warn you against making assumptions like the above. There
?
Alternatively, maybe it would it be easier to have the Mac users install
VMWare's free version and I can just have them install Windows or Linux
in that? Or does it also have weird dependency issues like this, too?
--
Chris Smith
___
Haskell-Cafe mailing list
On Wed, 2011-07-27 at 08:27 +0100, Tim Cowlishaw wrote:
(Perhaps wandering slightly O/T, but...) Having done some teaching in
similar circumstances before (although not with Haskell), I'd highly
recommend this approach. In fact, I'd probably have all the students,
regardless of OS install
regularly breaking with
every new operating system release).
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
ultimately realize that must mean something different.)
--
Chris Smith
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe
1 - 100 of 203 matches
Mail list logo