# Sum Types question

**URL:** https://discourse.julialang.org/t/sum-types-question/109576
**Category:** General Usage
**Created:** [February 1, 2024, 3:04pm UTC](https://discourse.julialang.org/t/sum-types-question/109576 "2024-02-01T15:04:19Z")
**Posts on this page:** 2
**Page:** 1

<div class="post-metadata">

### Author: ![Larbino1](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/larbino1/32/37831_2.png) [@Larbino1](https://discourse.julialang.org/u/Larbino1)
#### Post date: [February 1, 2024, 3:04pm UTC](https://discourse.julialang.org/t/sum-types-question/109576/1 "2024-02-01T15:04:19Z")

</div>

I am considering using sum types for my package, and I have a question about the interface. Say I have a sum type of fruits, `Apple` `Orange`, and `Pear`. I have 3 methods `consume(::Apple)`, `consume(::Orange)`, `consume(::Pear).`

If I have a

```julia
@sumtype Fruit begin
    AppleFruit(::Apple)
    OrangFruit(::Orange)
    PearFruit(::Pear)
end

```

Can I call consume `consume(::Fruit)` and rely on implicit conversion to convert to an `Apple`, `Orange` or `Pear`, or do I need to write my own `consume(::Fruit)` function with case that dispatches to each method?

---

<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 1, 2024, 3:29pm UTC](https://discourse.julialang.org/t/sum-types-question/109576/2 "2024-02-01T15:29:19Z")

</div>

> [@Larbino1](#):
>
> ```julia
> @sumtype Fruit begin
> AppleFruit(::Apple)
> OrangFruit(::Orange)
> PearFruit(::Pear)
> end
> 
> ```

I think what you meant to write here was something more like

```julia
@sum_type Fruit begin
    Apple # Maybe you want to store some data inside, like Apple(weight::Float64)
    Orange
    Pear
end

```

you’d then write something like

```julia
consume(f::Fruit) = @cases f begin
    Apple => do_something_for_apples() # If Apple stores data this might be Apple(w) => do_something_for_apples(w)
    Orange => do_something_for_oranges()
    Pear => do_something_for_pears()
end

```
