Hi everyone,

I was writing an Option Monad, and this is what i get from the following line:

```
m_join{T1<:Option,T2<:Option,T}(x::T1{T2{T}}) = get(None{T}(),x)
```

and structure of Option is as follows:

```
abstract type Option{T} <: Monad end
type Some{T} <: Option{T}
value::T
end
type None{T} <: Option{T}
end
```

I can’t figure out why that error is given? Can someone explain it to me? Thanks

1 Like

If I try the following:

```
m_join{T}(x::Option{Option{T}}) = get(None{T}(),x)
```

It gives me the following error:

```
ERROR: LoadError: MethodError: no method matching m_join(::JHC.Utility.Monads.Some{JHC.Utility.Monads.Some{Int64}})
Closest candidates are:
m_join(!Matched::JHC.Utility.Monads.TypedFun{JHC.Utility.Monads.TypedFun{T}}) where T at /home/xxx/Projects/JHC/src/Utility/Monads.jl:55
m_join(!Matched::JHC.Utility.Monads.Option{JHC.Utility.Monads.Option{T}}) where T at /home/xxx/Projects/JHC/src/Utility/Monads.jl:132
```

This approach seems to work:

```
function m_join(x::T1) where {T1 <: Option{T2}} where {T2 <: Option{T}} where {T}
get(None{T}(), x)
end
```

By the way, the syntax `f{T}(x::T)`

is being deprecated in favor of `f(x::T) where {T}`

.