forked from orion/obsidian
66 lines
1.4 KiB
Markdown
66 lines
1.4 KiB
Markdown
[[Typeclasses|Typeclass]] defining the [[Functions|function]] `map`, [[Infix Operators|operators]] `<$>`, and `<#>`.
|
|
|
|
```haskell
|
|
class Functor f where
|
|
map :: forall a b. (a -> b) -> f a -> f b
|
|
```
|
|
|
|
## map
|
|
For a [[Data Structures|data structure]] containing some data `a`, change the data using some function `a -> b`.
|
|
|
|
> [!info]
|
|
> Another way of thinking of map is that it **lifts** a function of `a -> b` to `f a -> f b`:
|
|
> ```haskell
|
|
> addTwo :: Int -> Int
|
|
> addTwo = add 2
|
|
>
|
|
> maybeAddTwo :: Maybe Int -> Maybe Int
|
|
> maybeAddTwo = map addTwo
|
|
> ```
|
|
|
|
Replaces the patterns:
|
|
- Modify every element in [[Collections|collection]] ...
|
|
- When [[Maybe|nullable]] value is non-null ...
|
|
- When _(potentially async)_ [[Effect|IO]] resolves ...
|
|
|
|
## Examples
|
|
### [[Array]] of [[Int]]
|
|
```haskell
|
|
add 1 <$> [1, 2, 3]
|
|
-- [2, 3, 4]
|
|
```
|
|
|
|
### [[Maybe]] of [[Int]]
|
|
```haskell
|
|
add 1 <$> Just 1
|
|
-- Just
|
|
|
|
add 1 <$> Nothing
|
|
-- Nothing
|
|
```
|
|
|
|
### [[Effect]] of [[Int]]
|
|
See also:
|
|
- [[Bind]]
|
|
- [[Show]]
|
|
- [[Functions/Composition|compose]]
|
|
- [[do notation]]
|
|
```haskell
|
|
import Node.FS.Sync (readTextFile, writeTextFile)
|
|
import Node.Encoding (Encoding(..))
|
|
import Data.Int as Int
|
|
|
|
writeNum :: Int -> Effect Unit
|
|
writeNum n = writeTextFile "num.txt" (show n) UTF8
|
|
|
|
readNum :: Effect Int
|
|
readNum =
|
|
readTextFile "num.txt" UTF8
|
|
>>= (Int.fromString >>> liftMaybe (error "invalid integer"))
|
|
|
|
main = do
|
|
writeNum
|
|
n <- add 1 <$> readNum
|
|
log $ show n
|
|
-- 2
|
|
``` |