Haskell operators I have trouble with
April 19, 2017
The Haskell $, . , and => operators.
$
Replaces parentheses.
All of the following are equivalent (per Michael Steele’s answer on Stack Overflow):
putStrLn (show (1 + 1))
putStrLn (show $ 1 + 1)
putStrLn $ show (1 + 1)
putStrLn $ show $ 1 + 1
(putStrLn . show) (1 + 1)
putStrLn . show $ 1 + 1
(putStrLn . show . (+ 1)) 1
putStrLn . show . (+ 1) $ 1
It’s type is:
Prelude> :type ($)
($) :: (a -> b) -> a -> b
- a function that maps type a to type b
- a value of type a
- output is a value of type b.
.
A Unix pipe for functions.
That is, feed the output of one function to the input of another.
For example, instead of let fn x = f (g x)
you can write
let fn = f . g
.
Note the second version doesn’t mention x
. In this style,
you don’t mention the input variable(s).
As another example, instead of f x = x + 1
you write f = (+ 1)
.
Confusingly, this is called writing in a pointfree style. “Pointfree” as in no input variables (“points” in topology).
It’s type is:
Prelude> :type (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
=>
“is an instance of”, but you read it right to left.
For example, (==) :: (Eq a) => a -> a -> Bool
is read “for every type a that is an instance of Eq”.
Type Classes and Overloading, A Gentle Introduction to Haskell, Version 98.
Here’s an example from Scotty: jsonData :: FromJSON a => ActionM a
.
Frankly, I’m still not 100% sure how to read this. My best guess is:
- For every type
a
that is an instance ofFromJSON
- you have (
=>
) - an operation named
jsonData
, which returns anActionM a
And this one is is not an operator, as it doesn’t have a type:
Prelude> :t (=>)
:1:2: error: parse error on input ‘=>’
Tags: haskell