This is the type I want to use:

```
struct S
F::Function
n::Int
end
```

However I want to allow only functions F which are of exactly this type:

```
F(n::Int, k::Int)::BigInt
```

How can I express this in the struct S?

This is the type I want to use:

```
struct S
F::Function
n::Int
end
```

However I want to allow only functions F which are of exactly this type:

```
F(n::Int, k::Int)::BigInt
```

How can I express this in the struct S?

You cannot. Julia does not encode the arguments and return-type of functions (or more like â€śmethodsâ€ť) in their type.

Side note, if you care about performance, then you should parameterize on the function-type:

```
struct S{T<:Function}
F::T
n::Int
end
```

3 Likes

There is FunctionWrappers.jl.

You cannot express it in the struct directly, but you can enforce something like this in the constructor, by checking the output of `Base.return_types(F, (Int, Int))`

.

This is not really a good idea. You are tying the logic of your code to inference (which is a heuristic) and the result will be very brittle.

1 Like

Is it the implementation that makes it brittle, or is the goal of restricting the input/output types of `F`

inherently problematic?

Something like (updated thanks @Tamas_Papp)

```
struct S
F::Function
n::Int
S(F::Function, n::Int) = new( (n::Int, k::Int) -> F(n, k)::BigInt, n)
end
```

might be ok?

But any attempt to try to error when the struct `S`

is created (as opposed to when `S.F`

is used) seems difficult.

2 Likes

Since the closure `isa Function`

, I guess you need some extra step not to get an infinite loop.

Thanks, updated.

1 Like

Would in this case still be advantageous to parametrize the sctruc with the function-type as proposed by @mauro3 ?

Likely, yes.

2 Likes

Thank you!