F# has syntactic support for monads called computation expressions (https://docs.microsoft.com/en-us/dotnet/fsharp/language-refe...). There are a couple of these included in the standard library (seq and async). However the language is impure so you are free to put side-effects anywhere you want without encoding it in your types.