
Arguably http://chimera.labs.oreilly.com/books/1230000000929 by Simon
Marlow is pretty authoritative on concurrency and parallelism in Haskell.
As a nice bonus, it contains one of the best explanations of weak-head
normal form and laziness in Haskell.
For lenses, Joseph Abrahamson has made some excellent tutorials on his
codewars account: http://www.codewars.com/users/tel/authored
The exercises take you through inventing lenses from scratch.
Learning `lens` specifically entails learning contravariant, profunctors,
choice, traversals, etc. It's not that bad understanding `lens` once you
have a facility for algebras-as-typeclasses and have an idea of the
end-goal by having played with and built lenses independently. To see some
older forms of lenses, consider googling "semantic editor combinator". The
nomenclature is suggestive.
Macros - basically anything about quasiquoting or TH. I point people in the
same direction here as I do with Generics. Look at example applications and
uses, then write your own. Being comfortable with folding/reducing ASTs
will help a lot here. You could use Aeson's TH module as a place to start
with this.
Continuation passing style - learning how "Cont" works is a good place to
start with CPS in Haskell. It's intimidating but not particularly
complicated…subtle in ways that can defeat learners.
I'm not much of an expert on Arrows. I feel people that have used them more
(such as in arrowized FRP) might be more helpful here. I had use for
`first` recently but I only used it because the Bifunctor wasn't available.
I feel I might be stating something self-evident, but Arrows can be nice if
you're kicking around a lot of stuff that's * -> * -> * and you want to
address the types therein and not partially apply them out of scope from
the interface. Example: Bifunctor is * -> * -> * whereas Functor is kind *
-> *. This lets me choose to map over the "Left" or the "Right"
constructors of an Either, rather than only mapping over the "Right" as in
the case of the Functor.
I stash resources and useful links in my guide here:
https://github.com/bitemyapp/learnhaskell
Hope this helps.
--- Chris Allen
On Mon, Nov 3, 2014 at 4:53 PM, Jeffrey Brown
What concepts relatively unique to Haskell are powerful, widely applicable, and not mentioned in most introductory texts? (By "relatively unique to Haskell" I mean maybe they're part of Lisp or Scheme, but not, say, Java.)
Some of the concepts important to Haskell, such as lambda expressions and recursion, are also present in more popular languages. Many others, though, either have no equivalent in (most) other languages, or else are very unlike the equivalent:
types, classes and kinds higher-order functions evaluation partial application tail recursion laziness currying pattern matching application and composition operations contexts functors, applicatives, monads monad transformers * lenses* * :def macros* * arrows* * continuation passing style* * software transactional memory*
Most of those topics appear to be covered by introductory texts, but the last five are not. I found each of them by accident, and each kind of blew my mind. They all strike me as powerful, widely applicable, and obscure.
Are there others?
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe