internal Func <double[], double> ToFunctionStrategy()
        {
            var types = typeof(FunctionStrategies)
                        .GetFields(BindingFlags.Static | BindingFlags.Public);

            var functions = new List <Func <double[], double> >();

            foreach (var functionName in FunctionNames)
            {
                foreach (var type in types)
                {
                    if (type.Name.Equals(functionName, StringComparison.OrdinalIgnoreCase))
                    {
                        functions.Add((Func <double[], double>)type.GetValue(null));
                        break;
                    }
                }
            }

            if (functions.Count != FunctionNames.Count())
            {
                throw new ArgumentException(nameof(FunctionNames));
            }

            if (functions.Count == 1)
            {
                return(functions.Single());
            }

            return(GetMultifunctionStrategy(functions.ToArray()));
        }