Learning Haskell – A Racket programmer's foray into the land of Haskell
lexi-lambda.github.io
lexi-lambda.github.io
inexactMatches xs ys = matches xs ys - exactMatches xs ys
then decides it's not very "nice", and ends up with this: inexactMatches = pure2 (-) <**> matches <**> exactMatches
I can sympathize with this preference. When I first started learning Haskell, figuring out how to make something point-free was extremely satisfying. And it also increases DRY, which is generally a good thing.But over time I realized I was overusing point-free style. It was fun to write, but harder to read. If I were actually writing "inexactMatches" for something real, I would strongly prefer the first over the second. From what I've read, I think many people take a similar path when learning Haskell.
That said, I think everyone has a different threshold. For example, I've heard many people say that a for loop is more clear than something like "map" or "fold". I would disagree with that, but maybe that's just because I've gotten used to "map" and "fold".
So maybe the author's brain is just able to handle point-free style better than mine can, but I do think this particular example if far enough on the spectrum that most Haskell programmers would prefer the first version (for real code).
So if you're considering learning Haskell, don't be scared away. You will have to start getting used to point-free style, but probably not to this extreme.
Anyway, I'm well-aware of the temptation of writing point-free code. I did include the sentence "I can see the road to hell is paved with point-free style" myself, after all. I wouldn't prefer point-free style if it ends up looking indiscernible, but in this case I sort of wanted a way to express semi-declaratively "this function is the difference between these other two functions". Does the version I ended up with do that? Yes. But for all I knew there could have been a much better, more idiomatic way.
But yes, that was both a quest to improve that code and a mere learning exercise. I'm satisfied with the version I ended up with, though I don't think it's perfect, either.
What's being implied here? that because the OP is not omnipotent that there is gender conspiracy?
Broadly making assumptions about everyone within a particular field is as bad if not worse than someone using an incorrect pronoun.
Just as an aside; everyone has to deal with imbeciles in this field whether it be the pointy haired boss or just gross incompetence, it's not gender specific.
And no, obviously I'm not saying people in the field of CS are all misogynist bigots. I'm just saying it's really, really male-dominated, so defaulting to "he" doesn't really cause problems. I'm not trying to attack anyone (and I agree it came off that way, I'm sorry), I just get frustrated when it's a perpetual thing I run into, y'know? Eventually I can get a little terse.
I'm just saying that I've read some papers by leading feminist theatre art/drama scholars, and even they use the masculine pronoun.
Also, I find it annoying that while you adknowledge OP's attempt to be gender neutral, you destroy her (see what I did there?) over a single pronoun, which happens to be gendered but is used neutrally.
which was completely unnecessary and added nothing meaningful to the discussion.
(In fact, it was self-contradictory given the insinuation that the OP had to be male in "I don't expect any different from this field.")
https://motivatedgrammar.wordpress.com/2009/09/10/singular-t...
http://www.quickanddirtytips.com/education/grammar/generic-s...
Go figure.
[1]http://dictionary.reference.com/browse/he
I hope I'm not explaining in a patronising manner.
I can't speak for you, but I'd find it puzzling at best, and a little upsetting at worst.
The word 'Aboriginal' also means Indigenous Australians, with an alternate meaning the indigenous people of a non-specific land.
I'm Asian myself. Might I get annoyed with the word? It's a possibility in another universe. Would I be annoyed by people who use it because they use it differently to what I expect? No.
English is just another language. In javascript you might be annoyed scope for variables is different depending on whether var is present. Are you going to be annoyed at people who use the presence or absence of var to designate whether the variable is local or global, instead of using window.myvar exclusively for global variables?
Well that is your choice, and personally I'd rather be fine with it than to get angry at anyone who use the word Asian or Aboriginal or write javascript differently to what I expect, otherwise I'd be angry a lot, making myself and others more upset than is necessary.
Anyways it was my attempt to empathise with both of them.
You know the answer: decades (centuries?) of usage defaulting to male.
OP went to great lengths to use neutral pronouns everywhere and you ding him (or her) for one slip up? One of the few people aware of the issues and trying to do good, someone in your camp?
And because of that obsession of yours, a good part of the entire discussion is now derailed.
You need to realize that you are part of the problem.
Oh my God. It's responses like yours that starkly remind me of how imbalanced it is for a woman in this industry and indeed in life.
In this season of Survivor, there is this deaf woman who wears a Cochlear implant. She can hear okay and it doesn't seem to handicap her much, but she's been bringing it up all the time to her teammates to the point that she's under the constant impression that she's being discriminated against because she's deaf, while the reality is just that she's a subpar competitor and her team is getting tired of her bringing up her deafness all the time while the simple truth is that they really don't care.
Basically, the only person on the show who's making a big deal of her deafness is herself.
Seems to me OP is doing the same thing here.
I really don't think you came off as far too aggressive at all. You called out a damaging trend and people interested in keeping privilege around didn't like it.
In this case the error is a little perplexing since the OP's name is "Lexi" which is almost never used as a male name!
If it's short for "Alexis," which is a claim you edited out of your comment, then I'm even more confused, as that name seems to be male preferred within the US.
http://www.wolframalpha.com/input/?i=Alexis
http://www.wolframalpha.com/input/?i=Alexis&a=*C.Alexis-_*Gi...
I feel silly now.
Not really, minorities have to face stuff like this on a more frequent basis. Gendered pronouns are more than incorrect and are harmful.
> Just as an aside; everyone has to deal with imbeciles in this field whether it be the pointy haired boss or just gross incompetence, it's not gender specific.
You can't just sweep away sexism under a rug.
Stereotypes are different than sexism. Some stereotypes are sexist, but assuming that someone is a man when it is likely that he/she is isn't sexist.
Maybe irritating, and rash judgement - but that's stereotypes in general.
Sexism is a belief that one gender is better than the other, or that some gender is bad in some way. Does assuming that someone is a male programmer make them sexist? Not really - not unless you _also_ assume other implications like "women can't program", or other such nonsense. But that's a leap to make.
In my experience I've found people who assume genders to have a reason for assuming. The most common reason is they don't believe women can program as well as men.
"Never attribute to malice that which is adequately explained by stupidity."
- As an aside, while I firmly believe that both genders have equal _potentials_, I think that due to various socioeconomic and cultural pressures, genders are _not_ equal at everything in execution, on average. It might take a while for that to happen.
and
"(Privileged) are more likely to reinforce their privilege (because the don't see their privilege and/or want to keep it)"
are two different things.
At face value these to things look the same, but upon examination it's only a convenient simplification.
The fact is, regardless of how you paint it, you're making prejudiced assumptions about him/her based the fact that (s)he belongs to the group of "people who write 'he' when talking about coders of unknown gender".
Assuming that (s)he is "privileged" is just yet another prejudice, not a fact upon which to base your opinion.
???
Men are more privileged than women, that is fact.
> You're going to spend all that work using "the author"
> everywhere and still manage to get my gender wrong
> ("his")?
Where would you have had the commenter go to establish your gender? You haven't attached your name to the article, but even if you had, it's a name that in many countries is male anyway. Would you have rather the commenter have said 'their'?Yes, of course.
As the poster demonstrated (by using "the author" in almost all places), it is often possible to go without pronouns entirely, at the expense of some repetitiveness or awkwardness. In this case, all that would have been required would have been to change
> The author spends a lot of effort trying to make his functions point-free.
to
> The author spends a lot of effort trying to make functions point free.
or, if the possessive is really important, the awkward
> The author spends a lot of effort trying to make the author's [or just "his or her"] functions point free.
However, as I have said elsethread, I think that this was almost certainly inattentiveness rather than any attempt to perpetuate gender biases.
> The author spends a lot of effort trying to make their functions point free.
I agreed with what I took (emphasis: my interpretation, not endorsed by peteretep) to be the subtext of that question, namely that the use of 'their' in that context is undesireable, and argued that it was not the only alternative to a gendered pronoun.
"The author spends a lot of effort trying to make his functions point-free."
You can simply remove the word "his".
For starters you might want to read up on gender neutral pronouns. He/She or his/hers can be used in a gender neutral manner, however traditionally the masculine form is used in English when gender neutral is intended.
They/them/their has been seeing broad adoption as a, y'know, actually gender-neutral pronoun, and it should be encouraged. I know some people prefer he/him/his but
a) many people think that reeks of implicit sexism
b) even ignoring a), elevating that to The One Correct English Way is ridiculous overreach
[1]: https://en.wikipedia.org/wiki/Part_of_speech#Open_and_closed...
For more fun facts and rants about gender-neutral they, see: http://itre.cis.upenn.edu/~myl/languagelog/archives/005423.h...
-----
Note: there's a strong difference between gender-neutral they when the gender is unknown, and singular they when the gender is known. Some people actually prefer being referred to with 'they/their' in sentences such as "Mary finished their ph.d. at Oxford". I doubt you'll find much historic precedence for that usage, but the use of 'their' when the gender is unknown/unspecified has a long history.
Well, each to their own.
[1]: this right here is why 'they' as neutral is problematic, as I would have been able to use 'they' unambiguously (instead of 'those authors') had 'they' not grown a singular meaning. It's the point made above about two dimensions rather than one of uncertainty.
I wouldn't say "they both" is very number-ambiguous, though sure you can always find ambiguous examples, but then language is full of ambiguity and humans still seem to manage fine.
To bad then that I never said anything about history, but just widespread adoption. So there is not much need to condescendingly point out Shakespeare and Austen, when they are just tangentially related.
The usage doesn't need to spread beyond discussions of the term itself, because it was already being used long before these discussions. That's why I linked to the articles about Shakespeare's and Austen's usage, they are data. I find it a bit of a stretch to interpret that as me saying "you obviously haven't read Shakespeare and Austen" (in any case, I've never read Austen myself and definitely can't remember what pronouns Shakespeare used from what little we read in school; I leave it to the historical linguists to dig out the usage examples).
Back to the matter at hand, if you want something definitely contemporary, of the five first tweets at https://twitter.com/search?q=they I see two which could have been replaced with "he" ("if someone wants to follow you {he,they}'ll follow", "Never miss an opportunity to tell someone how much {he,they} mean to you.").
My mistake. I should have known that someone would take the opportunity to mince words when we're on the topic of language and communication, if it would suit their goal.
To be more concrete: I meant penetrate usage in writing in a contemporary setting. I don't know if it penetrated usage over a hundred years ago if it isn't relevant to written communication today. I communicate with people in this era, not with people from the past. Debating whether using a gendered pronoun obscures meaning or not implicitly refers to communication in this day and age, not the past.
But if you want to be an elitist and dismiss my experience over not being literate with the classics, go ahead.
I certainly never said anything about "The One Correct English Way".
As for the condescension; yes that was intended. The response was overly hostile and out of line so the condescension was deserved IMHO. Don't worry yourself though Mike; I spread around the condescension equally to all genders.
Please don't spread any more condescension on Hacker News. Although I'm sure you don't mean to, it's one of the worst things you could do to damage this community.
Is "they" or "him/her" a better way forward? Sure. Is it standard practice? No. Can you infer anything about the author's attitudes by his use of standard English grammar? No.
> "The student will have to read this book carefully if he wishes to do well." - OK
> "A student is expected to attend 90% of the lectures, or he will be in trouble." - WRONG, if your audience has women
> "Julia thought she did well on the exam and he was right." - WRONG
> "Julia thought she did well on the exam and they were right." - WRONG
Personal swipes are not allowed in Hacker News comments, regardless of how annoying or provocative some other comment may have been.
(I'm inclined to say that pronoun wars shouldn't be, either, considering the madness that this thread devolved into.)
As you notice, the poster to whom you are replying clearly goes to a lot of effort to say "the author" repeatedly, rather than 'he' or 'she'. I think that it's fair to assume that one slip-up after such work is a result of innocent inattention rather than a perpetuation of gender biases.
What was there to improve? It's totally sensible and readable, and you even mention that you had people on IRC tell you the function was fine as it is.
Wow, you got some really hostile reactions for your politely worded comment. Some of those responses belong on @shithnsays
In the case of pointfree style, there's a code golf aspect to it as well, it's kinda fun trying to rewrite a particular expression to eliminate variables and maximize the amount of non-alphanumeric characters!
1. Sorry to everyone about the "his". Like most people guessed, I explicitly tried not to use gender, but I slipped up.
2. I didn't mean to imply you were bad at programming. The only goal of my comment was "if you're thinking about learning Haskell, don't be scared off by point-free style". I thought that providing more background would help people understand the temptation, but I should have divorced it more from your decision to use point-free style.
(What's funny is that these were things I was aware of and tried to handle well, but still managed to screw up.)
A reasonably clean way would be to define
data Color = Red | Green | Blue | Yellow | Orange | Purple
deriving (Enum, Bounded, Show)
and then (e.g. in ghci) you can do >> [minBound .. maxBound] :: [Color]
[Red,Green,Blue,Yellow,Orange,Purple]
I often define the useful function enumerate :: (Enum a, Bounded a) => [a]
enumerate = [minBound .. maxBound]
for exactly this purpose.After a while spent programming in Haskell you would probably develop your own mini-library of functions that make your life easier. Another one I often find useful is
(.:) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
(.:) f g = \x y -> f (g x y)
which e.g. allows you to define the absolute distance function dist :: (Num a) => a -> a -> a
dist = abs .: (-)
A fun challenge is figuring out why the definition of (.:) is equivalent to (.:) = fmap . fmap
!> (.:) = fmap . fmap
> !
Of course it's not really equivalent, since the most general type of the LHS is as you have said, whereas that of the RHS involves functor constraints; but inlining the definition of `fmap` for arrows gives the amusing definition:
(.:) = (.) . (.)
I tend to figure this sort of thing out by successive eta conversion: \f g x y -> f (g x y)
\f g x y -> (f . g x) y
\f g x -> f . g x
\f g x -> ((f .) . g) x
\f g -> (f .) . g
\f g -> ((f .) .) g
\f -> ((f .) .)
\f -> (.) (f .)
\f -> (.) ((.) f)
\f -> ((.) . (.)) f
(.) . (.)
Is there a better way? (.:) f g = (f .) . g
This can interestingly be generalized(in a way) to get (.::) :: (d -> e) -> (a -> b -> c -> d) -> a -> b -> c -> d
(.::) f g = ((f .) .) . g
and so on.Since fmap = (.), substitution would get your point free form.
(...) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
since (...) = (.) . (.)
.My long term goal is to write a realtime game server with it, however, I keep flopping back and forth between wrapping my head around the high learning curve and jumping to something more familiar to Get Things Done. It seems the payoff for learning Haskell is intrinsic in and of itself even if I never end up using it, yet I can't help but wonder if I'm spending my time wisely.
You had some advantages though since you've used Racket in the past.
I feel like your Racket experience helped you draw conclusions that many wouldn't have otherwise. Great work though, I hope you write about more of your experiences.
That said, I'm sure I'm totally influenced by various languages I've tried in the past. And FWIW, Racket was also plenty far from my first experience with functional programming. I know so many programming languages that I've gotten pretty used to being able to just "pick them up" in a couple of days (Racket pretty much included).
Haskell... not so much.
- Knowing to start from scratch and assuming it's some install issue with ghc-mod (this probably saved you a lot of time) - already knowing partial application and that you can use backticks to take advantage of it in Haskell - just knowing what pointfree means - knowing about hoogle - knowing how to search hoogle and what type of function you needed - having an interest in the asthetics of your code leading to experimentation that seems pointless but teaches you a lot - having confidence/knowledge of being able to just plugin functions/types.
As far as conclusions, I'm mostly commenting on the conclusions you simply made from the types... what people sometimes call "type tetris". Knowing you needed `(a, a) -> Bool`, searching hoogle, then coming to the conclusion of I'll implement it myself and moving on.
For a while it seemed like you were going to get caught in "point free hell" and give up on your task... something I've sadly done in the past.
Then knowing to ask for help in #haskell and /r/haskell really helped you.
I know I haven't really answered your question of "what conclusions you'd say they are"... what I was really trying to say is you made a lot of conceptual leaps I wouldn't expect someone with very little Haskell experience to make.
If I remember I'll try to come back to this tomorrow and look for a few examples of those conceptual leaps.
I'd also poke about at the wiki-book 'Write a scheme in 48 hours' (in Haskell) which I've also found useful (although the pdf version has some errors, so I've been preferring the HTML version http://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_H... )
Apologies if you've already been through these materials! :)
It was really refreshing to see somebody write about the struggle to pick up Haskell - indeed, I had a lot of the same issues. I often feel the Haskell community is burdened with this stigma of "if you have to ask questions, you're probably too stupid to get it". This is despite the fact that there is actually a really great group of people always willing to help in #haskell. It's primarily an image problem, one a lot of FP languages suffer from.
We need more articles talking about the pain points of Haskell so we can get better at making this stuff accessible. We need to be honest with new starters, tell them it's okay to find this stuff challenging and show them where to find help. More than that, though, we need to think about what we can do in the language to fix some of these pain points in a way that the community is happy with.
"Fine. It's good enough. Moving On." made me laugh! It seems like you thought that could be refactored in a much simpler way. Not knowing (much) Racket, it didn't appear super obvious to me how. Were you alluding to a macro or something? How would you do it in Racket?
I guess I was just hoping that Haskell, being a more composition-oriented language in many ways, would have some nice built-in to do that for me.
: inexact-matches ( x y -- n )
[ matches ] [ exact-matches ] 2bi - ;
That is, run both “matches” and “exact-matches” on both inputs, then take the difference of the results. If Haskell had functions of multiple parameters and results, 2bi’s type would look like this: (a, b, ((a, b) -> c), ((a, b) -> d)) -> (c, d)(I would count Haskell as my first 'proper' language, and prior to all this, I had zero coding experience.)
I experienced a lot of the same detours that you have gone through.
re: point-free code
There's a plug in that you can use, called pointfree (cabal install pointfree). I found that it was more useful to me for experimenting with point-free style than writing my own code in that way.
[1] http://learnyouahaskell.com [2] http://haskellrecipes.tumblr.com