# Functional programming in Julia

**URL:** <https://discourse.julialang.org/t/functional-programming-in-julia/55548>\
**Category:** New to Julia\
**Tags:** question, package, function\
**Created:** [February 18, 2021, 3:44pm UTC](https://discourse.julialang.org/t/functional-programming-in-julia/55548 "2021-02-18T15:44:32Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![iHany](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ihany/32/18151_2.png) [@iHany](https://discourse.julialang.org/u/iHany)\
**Post date:** [February 18, 2021, 3:44pm UTC](https://discourse.julialang.org/t/functional-programming-in-julia/55548/1 "2021-02-18T15:44:32Z")

</div>

I’m recently interested in functional programming (FP) style.

I sometimes felt that Julia has probably been inspired by FP but it seems that Julia does not officially provide FP tools, for example, lazy evaluation.

I found [Lazy.jl](https://github.com/MikeInnes/Lazy.jl) but it looks not being maintained.

Is there any project for FP style coding in Julia? Or, FP style in Julia has been disappeared?

---

<div class="post-metadata">

**Author:** ![orialb](https://avatars.discourse-cdn.com/v4/letter/o/65b543/32.png) [@orialb](https://discourse.julialang.org/u/orialb)\
**Post date:** [February 18, 2021, 4:22pm UTC](https://discourse.julialang.org/t/functional-programming-in-julia/55548/2 "2021-02-18T16:22:48Z")

</div>

Maybe you will find this package interesting: [https://github.com/thautwarm/MLStyle.jl](https://github.com/thautwarm/MLStyle.jl) .

---

<div class="post-metadata">

**Author:** ![Satvik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/satvik/32/20486_2.png) [@Satvik](https://discourse.julialang.org/u/Satvik)\
**Post date:** [February 18, 2021, 5:44pm UTC](https://discourse.julialang.org/t/functional-programming-in-julia/55548/3 "2021-02-18T17:44:02Z")

</div>

Some things that don’t directly allow functional syntax, but still support a functional style:

- `Underscores.jl` gives you better syntax for lambdas, `Chain.jl` is a similar alternative
- `Base.Iterators` and `IterTools.jl` give you some lazy evaluation, e.g. when combined with `Underscores.jl` you can write things like

```julia
function k_digit_numbers_from_sequence(k, my_sequence_fn)
    nums = @_ Iterators.countfrom() |> 
    IterTools.imap(my_sequence_fn(_), __) |> 
    Iterators.takewhile(<(10^k), __) |> 
    Iterators.filter(>=(10^(k-1), __) |> 
    collect
    return nums
end

```

- `Transducers.jl` is an alternative to `Iterators`, inspired by Clojure
- `ThreadsX.jl` makes it easy to parallelize functional code, especially with `ThreadsX.map`

---

<div class="post-metadata">

**Author:** ![Mason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mason/32/2423_2.png) [@Mason](https://discourse.julialang.org/u/Mason)\
**Post date:** [February 18, 2021, 8:25pm UTC](https://discourse.julialang.org/t/functional-programming-in-julia/55548/4 "2021-02-18T20:25:33Z")

</div>

> [@Satvik](#):
>
> - `Transducers.jl` is an alternative to `Iterators` , inspired by Clojure

Just to nitpick, my understanding is that Transducers aren’t an alternative to iterators, so much as a powerful tool for optimizing the traversal and nesting of iterators.

To be a bit more precise, transducers replace the `iterate` function on an iterator, but do _not_ replace the role iterators play in giving a lazy description of a set of computations.

---

<div class="post-metadata">

**Author:** ![Satvik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/satvik/32/20486_2.png) [@Satvik](https://discourse.julialang.org/u/Satvik)\
**Post date:** [February 18, 2021, 8:55pm UTC](https://discourse.julialang.org/t/functional-programming-in-julia/55548/5 "2021-02-18T20:55:00Z")

</div>

Good point, and I should have clarified: the Transducers package can do a lot of the same things as the Iterators + IterTools packages, but the underlying mechanisms are quite different. Rich Hickey’s talk is always a good source for details: ["Transducers" by Rich Hickey - YouTube](https://www.youtube.com/watch?v=6mTbuzafcII&t=1827s)

---

<div class="post-metadata">

**Author:** ![iHany](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ihany/32/18151_2.png) [@iHany](https://discourse.julialang.org/u/iHany)\
**Post date:** [February 19, 2021, 3:41am UTC](https://discourse.julialang.org/t/functional-programming-in-julia/55548/6 "2021-02-19T03:41:19Z")

</div>

Can `Transducers.jl` deal with infinite iterator (like `Iterators.countfrom()`) for lazy evaluation?

EDIT: It works as `Underscores.jl` does as follows.

```julia
julia> Iterators.countfrom() |> Map(x -> 2x) |> TakeWhile(x -> x < 10) |> collect
4-element Array{Int64,1}:
 2
 4
 6
 8

```
