# Confused about #includes

**URL:** https://discourse.mc-stan.org/t/confused-about-includes/25835
**Category:** Modeling
**Created:** [December 31, 2021, 5:08pm UTC](https://discourse.mc-stan.org/t/confused-about-includes/25835 "2021-12-31T17:08:58Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### Author: ![Qoftheday](https://yyz2.discourse-cdn.com/flex030/user_avatar/discourse.mc-stan.org/qoftheday/32/11505_2.png) [@Qoftheday](https://discourse.mc-stan.org/u/Qoftheday)
#### Post date: [December 31, 2021, 5:08pm UTC](https://discourse.mc-stan.org/t/confused-about-includes/25835/1 "2021-12-31T17:08:58Z")

</div>

I was trying to figure out how #include statements work. I’m using rstan 2.21.3, but I consulted the most recent documentation as well. I diffed the relevant sections of the Stan User’s Guide for 2.21 and 2.28 [2\_28 includes](https://mc-stan.org/docs/2_28/reference-manual/includes.html#includes.section) and they differ only in trivial ways. I’m following the examples in the text.

Suppose I have a model that defines a function, but I also wish to include some shared functions by using an #include statement.

I can’t have two functions blocks, so the #included file must only consist of the bare function definition, so in my-std-normal-stan I have this:

```stan
  real included_my_std_normal_lpdf(real y) {
    return -0.5 * y' * y;
  }

```

and in my main file I have this:

```stan
functions {
  #include my-std-normal.stan
  real defined_here_my_std_normal_lpdf(real y) {
    return -0.5 * y' * y;
  }
}
parameters {
  real y;
}
model {
  y ~ defined_here_my_std_normal();
  y ~ included_my_std_normal();
}

```

However, when checking the syntax, or when compiling the model with a call to stan\_model(), I get the following error:

```
SYNTAX ERROR, MESSAGE(S) FROM PARSER:
Probability function must end in _lpdf or _lpmf. Found distribution family = included_my_std_normal with no corresponding probability function included_my_std_normal_lpdf, included_my_std_normal_lpmf, or included_my_std_normal_log
 error in 'model3cc26a57f781_expt_function_defs' at line 13, column 31
  -------------------------------------------------
    11: model {
    12: y ~ defined_here_my_std_normal();
    13: y ~ included_my_std_normal();
                                      ^
    14: }
  -------------------------------------------------

Error in stanc(filename, allow_undefined = TRUE) : 
  failed to parse Stan model 'expt_function_defs' due to the above error.

```

On the other hand, if I remove the #include statement and substitute the function definition it compiles fine. And if I remove the indentation before the #include it works fine; that contradicts section 2.01 in both versions of the manual, which says that whitespace is allowed before #includes.

It seems there was a lot of discussion about this in 2017, but it’s not clear to me what the final outcome was. Here’s the link: [https://discourse.mc-stan.org/t/syntax-and-scope-for-stan-language-includes/239](https://discourse.mc-stan.org/t/syntax-and-scope-for-stan-language-includes/239).

Finally, the code in version 2\_21 doesn’t compile for another reason, a type mismatch: In the documentation, the function definition declares y as a vector, but in the parameters block as a real. Is this different in rstan 2\_26? The documentation for 2\_26 is the same.

```stan
functions {
  real my_std_normal_lpdf(vector y) {
    return -0.5 * y' * y;
  }
}
parameters {
  real y;
}
model {
  y ~ my_std_normal();
}

```

```
SYNTAX ERROR, MESSAGE(S) FROM PARSER:
No matches for: 

  real ~ my_std_normal()

Available argument signatures for my_std_normal:

  vector ~ my_std_normal()

Real return type required for probability function.
 error in 'model3cc2bc40ed1_expt_3function_defs' at line 10, column 22
  -------------------------------------------------
     8: }
     9: model {
    10: y ~ my_std_normal();
                             ^
    11: }
  -------------------------------------------------

Error in stanc(filename, allow_undefined = TRUE) : 
  failed to parse Stan model 'expt_3function_defs' due to the above error.

```

Thanks

EDIT: @maxbiostat edited this post for syntax highlighting.
