# Optional arguments to inner type constructor

**URL:** <https://discourse.julialang.org/t/optional-arguments-to-inner-type-constructor/3044>\
**Category:** General Usage\
**Created:** [April 4, 2017, 8:48am UTC](https://discourse.julialang.org/t/optional-arguments-to-inner-type-constructor/3044 "2017-04-04T08:48:18Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![kkmann](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kkmann/32/1727_2.png) [@kkmann](https://discourse.julialang.org/u/kkmann)\
**Post date:** [April 4, 2017, 8:48am UTC](https://discourse.julialang.org/t/optional-arguments-to-inner-type-constructor/3044/1 "2017-04-04T08:48:18Z")

</div>

Hi,

I am trying to implement a type with optional arguments to its inner constructor, like

```julia
type A
    b
    c
    function A(b; c = 1)
        new(b, c)
    end
end

```

which works like a charm when I call A(2). However, when I add type information it breaks down:

```julia
type AT{T}
    b::T
    c
    function AT(b::T; c = 1)
        new(b, c)
    end
end

```

gives a MethodError (falls back to convert, does not find right constructor).

---

<div class="post-metadata">

**Author:** ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)\
**Post date:** [April 4, 2017, 11:19am UTC](https://discourse.julialang.org/t/optional-arguments-to-inner-type-constructor/3044/2 "2017-04-04T11:19:39Z")

</div>

This is unrelated to optional arguments. You are defining an inner constructor, i.e. a method for `AT{T}` in the second case which should be called as `AT{Int}(1)`. Define a method for `(::Type{AT}){T}(b::T; c = 1)` if you want `AT(1)` to work. (Syntax might become simpler as current conflicting syntax get’s deprecated).

---

<div class="post-metadata">

**Author:** ![kkmann](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kkmann/32/1727_2.png) [@kkmann](https://discourse.julialang.org/u/kkmann)\
**Post date:** [April 4, 2017, 11:31am UTC](https://discourse.julialang.org/t/optional-arguments-to-inner-type-constructor/3044/3 "2017-04-04T11:31:51Z")

</div>

I see the problem now, thanks. I do not get the meaning of (::Type{AT}){T}, though. What does it mean exactly?

---

<div class="post-metadata">

**Author:** ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)\
**Post date:** [April 4, 2017, 11:38am UTC](https://discourse.julialang.org/t/optional-arguments-to-inner-type-constructor/3044/4 "2017-04-04T11:38:33Z")

</div>

It means that you are defining a method for somthing of type `Type{AT}`, i.e. the object `AT`, and the method is parametrized with a type paremeter `T`.

---

<div class="post-metadata">

**Author:** ![kkmann](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kkmann/32/1727_2.png) [@kkmann](https://discourse.julialang.org/u/kkmann)\
**Post date:** [April 4, 2017, 11:43am UTC](https://discourse.julialang.org/t/optional-arguments-to-inner-type-constructor/3044/5 "2017-04-04T11:43:19Z")

</div>

Sorry for asking again, does “(::Type{AT}){T}” have a “name” or something? Is this syntax constructor-specific? Looks totally weird to me oO …

edit:  
also, whats the advantage over defining an external constructor AT{T}(b::T; c = 1) = AT{T}(b::T, c) and leaving the inner constructor to default? I wanted to save the external constructor becuase it results in a lot of boiler-plate code with many fields.

---

<div class="post-metadata">

**Author:** ![adamslc](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/adamslc/32/3452_2.png) [@adamslc](https://discourse.julialang.org/u/adamslc)\
**Post date:** [April 5, 2017, 1:11am UTC](https://discourse.julialang.org/t/optional-arguments-to-inner-type-constructor/3044/6 "2017-04-05T01:11:17Z")

</div>

You might also want to look at `Parameters.jl`. I think it does what you are looking for.

> **[GitHub - mauro3/Parameters.jl: Types with default field values, keyword...](https://github.com/mauro3/Parameters.jl)**
>
> Types with default field values, keyword constructors and (un-)pack macros - GitHub - mauro3/Parameters.jl: Types with default field values, keyword constructors and (un-)pack macros

---

<div class="post-metadata">

**Author:** ![kkmann](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kkmann/32/1727_2.png) [@kkmann](https://discourse.julialang.org/u/kkmann)\
**Post date:** [April 5, 2017, 11:51am UTC](https://discourse.julialang.org/t/optional-arguments-to-inner-type-constructor/3044/7 "2017-04-05T11:51:30Z")

</div>

That’s even better than what I had in mind 😉
