History
Versions
Language evolution
F# uses an open development and engineering process. The language evolution process is managed byLanguage overview
Functional programming
While supporting object-oriented features available in C#, F# is aif
expressions, try
expressions and loops, is a composable expression with a static type. Functions and expressions that do not return any value have a return type of unit
. F# uses the let
keyword for binding values to a name. For example:
7
to the name x
.
New types are defined using the type
keyword. For functional programming, F# provides ''tuple'', ''record'', ''discriminated union'', ''list'', ''option'', and ''result'' types. A ''(A, B, C)
, where A, B, and C are values of possibly different types. A tuple can be used to store values only when the number of values is known at design-time and stays constant during execution.
A ''record'' is a type where the data members are named. Here is an example of record definition:
with
keyword is used to create a copy of a record, as in , which creates a new record by copying r
and changing the value of the Name
field (assuming the record created in the last example was named r
).
A discriminated union type is a type-safe version of C unions. For example,
::
is the cons operator) or a shorthand as . An empty list is written []
. The ''option'' type is a discriminated union type with choices Some(x)
or None
. F# types may be generic programming, generic, implemented as generic .NET types.
F# supports lambda functions and closures. All functions in F# are first class values and are immutable. Functions can be curried. Being first-class values, functions can be passed as arguments to other functions. Like other functional programming languages, F# allows function composition (computer science) using the >>
and <<
operators.
F# provides ' that define a sequence seq
, list ... /code> or array
_seq_
forms_a_sequence_of_squares_of_numbers_from_0_to_14_by_filtering_out_numbers_from_the_range_of_numbers_from_0_to_25._Sequences_are_ Generator_(computer_programming), generators_–_values_are_generated_on-demand_(i.e.,_are_ lazily_evaluated)_–_while_lists_and_arrays_are_evaluated_eagerly.
F#_uses_ pattern_matching_to_bind_values_to_names._Pattern_matching_is_also_used_when_accessing_discriminated_unions_–_the_union_is_value_matched_against_pattern_rules_and_a_rule_is_selected_when_a_match_succeeds._F#_also_supports_''Active_Patterns''_as_a_form_of_extensible_pattern_matching. _It_is_used,_for_example,_when_multiple_ways_of_matching_on_a_type_exist.
F#_supports_a_general_syntax_for_defining_compositional_computations_called_'._Sequence_expressions,_asynchronous_computations_and_queries_are_particular_kinds_of_computation_expressions._Computation_expressions_are_an_implementation_of_the_ monad_pattern.
_Imperative_programming
F#_support_for_imperative_programming_includes
*_for
_ loops
*_while
_ loops
*_ arrays,_created_with_the_ Associative_array, hash_table,_created_with_the_dict__..._/code>_syntax_or_System.Collections.Generic.Dictionary<_,_>
_type.
Values_and_record_fields_can_also_be_labelled_as_mutable
._For_example:
//_Define_'x'_with_initial_value_'1'
let_mutable_x_=_1
//_Change_the_value_of_'x'_to_'3'
x_<-_3
Also,_F#_supports_access_to_all_CLI_types_and_objects_such_as_those_defined_in_the_System.Collections.Generic
_namespace_defining_imperative_data_structures.
_Object-oriented_programming
Like_other__Common_Language_Infrastructure_(CLI)_languages,_F#_can_use_CLI_types_through_object-oriented_programming. __F#_support_for_object-oriented_programming_in_expressions_includes:
*_Dot-notation,_e.g.,_
*_Object_expressions,_e.g.,_
*_Object_construction,_e.g.,_
*_Type_tests,_e.g.,_
*_Type_coercions,_e.g.,_
*_Named_arguments,_e.g.,_
*_Named_setters,_e.g.,_
*_Optional_arguments,_e.g.,_
Support_for_object-oriented_programming_in_patterns_includes
*_Type_tests,_e.g.,_
*_Active_patterns,_which_can_be_defined_over_object_types
F#_object_type_definitions_can_be_class,_struct,_interface,_enum,_or_delegate_type_definitions,_corresponding_to_the_definition_forms_found_in__C#._For_example,_here_is_a_class_with_a_constructor_taking_a_name_and_age,_and_declaring_two_properties.
///_A_simple_object_type_definition
type_Person(name_:_string,_age_:_int)_=
____member_x.Name_=_name
____member_x.Age_=_age
_Asynchronous_programming
F#_supports_ asynchronous_programming_through_''asynchronous_workflows''. _An_asynchronous_workflow_is_defined_as_a_sequence_of_commands_inside_an_async
,_as_in
let_asynctask_=_
____async_
The_let!
_indicates_that_the_expression_on_the_right_(getting_the_response)_should_be_done_asynchronously_but_the_flow_should_only_continue_when_the_result_is_available._In_other_words,_from_the_point_of_view_of_the_code_block,_it's_as_if_getting_the_response_is_a_blocking_call,_whereas_from_the_point_of_view_of_the_system,_the_thread_won't_be_blocked_and_may_be_used_to_process_other_flows_while_the_result_needed_for_this_one_doesn't_become_available.
The_async_block_may_be_invoked_using_the_Async.RunSynchronously
_function._Multiple_async_blocks_can_be_executed_in_parallel_using_the_Async.Parallel
_function_that_takes_a_list_of_async
_objects_(in_the_example,_asynctask
_is_an_async_object)_and_creates_another_async_object_to_run_the_tasks_in_the_lists_in_parallel._The_resultant_object_is_invoked_using_Async.RunSynchronously
.
Inversion_of_control_in_F#_follows_this_pattern.
_Parallel_programming
Parallel_programming_is_supported_partly_through_the_Async.Parallel
,_Async.Start
_and_other_operations_that_run_asynchronous_blocks_in_parallel.
Parallel_programming_is_also_supported_through_the_Array.Parallel
_functional_programming_operators_in_the_F#_standard_library,_direct_use_of_the_System.Threading.Tasks
_task_programming_model,_the_direct_use_of_.NET_thread_pool_and_.NET_threads_and_through_dynamic_translation_of_F#_code_to_alternative_parallel_execution_engines_such_as_ GPU _code.
_Units_of_measure
The_F#_type_system_supports_ units_of_measure_checking_for_numbers._The_units_of_measure_feature_integrates_with_F#_type_inference_to_require_minimal_type_annotations_in_user_code.
_Metaprogramming
F#_allows_some_forms_of_syntax_customizing_via_ metaprogramming_to_support_embedding_custom_ domain-specific_languages_within_the_F#_language,_particularly_through_computation_expressions.
F#_includes_a_feature_for_run-time_meta-programming_called_quotations._A_quotation_expression_evaluates_to_an_abstract_syntax_tree_representation_of_the_F#_expressions._Similarly,_definitions_labelled_with_the_ lt;ReflectedDefinition>/code>_attribute_can_also_be_accessed_in_their_quotation_form._F#_quotations_are_used_for_various_purposes_including_to_compile_F#_code_into_JavaScript_
JavaScript_(),_often_abbreviated_as_JS,_is_a__programming_language_that_is_one_of_the_core_technologies_of_the__World_Wide_Web,_alongside_HTML_and_CSS._As_of_2022,_98%_of__websites_use_JavaScript_on_the__client_side_for__webpage_behavior,_of_...
_Information-rich_programming
F#_3.0_introduced_a_form_of_compile-time_meta-programming_through_statically_extensible_type_generation_called_F#_type_providers._Agent_programming
F#_supports_a_variation_of_the__Development_tools
*__Application_areas
F#_is_a_ general-purpose_programming_language._Web_programming
Th_Cross-platform_app_development
F#_can_be_used_together_with_th__Analytical_programming_
Among_others,_F#_is_used_for_quantitative_finance_programming,_energy_trading_and_portfolio_optimization,_machine_learning,_business_intelligence_and_social_gaming_on__Scripting
F#_can_be_used_as_a_scripting_language,_mainly_for_desktop_ read–eval–print_loop_(REPL)_scripting._Open-source_community
The_F#_ open-source_community_includes_the_F#_Software_Foundation_Compatibility
F#_features_a_legacy_"ML_compatibility_mode"_that_can_directly_compile_programs_written_in_a_large_subset_of_OCaml_roughly,_with_no_functors,_objects,_polymorphic_variants,_or_other_additions._Examples
A_few_small_samples_follow:_See_also
*___Notes
_References
*_ *_ *_ *_ *_ *_ *_ *__External_links
*__The_F#_Software_Foundation_Imperative_programming
F#_support_for_imperative_programming_includes *_for
_ loops
*_while
_ loops
*_ arrays,_created_with_the_ Associative_array, hash_table,_created_with_the_dict__..._/code>_syntax_or_System.Collections.Generic.Dictionary<_,_>
_type.
Values_and_record_fields_can_also_be_labelled_as_mutable
._For_example:
//_Define_'x'_with_initial_value_'1'
let_mutable_x_=_1
//_Change_the_value_of_'x'_to_'3'
x_<-_3
Also,_F#_supports_access_to_all_CLI_types_and_objects_such_as_those_defined_in_the_System.Collections.Generic
_namespace_defining_imperative_data_structures.
_Object-oriented_programming
Like_other__Common_Language_Infrastructure_(CLI)_languages,_F#_can_use_CLI_types_through_object-oriented_programming. __F#_support_for_object-oriented_programming_in_expressions_includes:
*_Dot-notation,_e.g.,_
*_Object_expressions,_e.g.,_
*_Object_construction,_e.g.,_
*_Type_tests,_e.g.,_
*_Type_coercions,_e.g.,_
*_Named_arguments,_e.g.,_
*_Named_setters,_e.g.,_
*_Optional_arguments,_e.g.,_
Support_for_object-oriented_programming_in_patterns_includes
*_Type_tests,_e.g.,_
*_Active_patterns,_which_can_be_defined_over_object_types
F#_object_type_definitions_can_be_class,_struct,_interface,_enum,_or_delegate_type_definitions,_corresponding_to_the_definition_forms_found_in__C#._For_example,_here_is_a_class_with_a_constructor_taking_a_name_and_age,_and_declaring_two_properties.
///_A_simple_object_type_definition
type_Person(name_:_string,_age_:_int)_=
____member_x.Name_=_name
____member_x.Age_=_age
_Asynchronous_programming
F#_supports__asynchronous_programming_through_''asynchronous_workflows''. _An_asynchronous_workflow_is_defined_as_a_sequence_of_commands_inside_an_async
,_as_in
let_asynctask_=_
____async_
The_let!
_indicates_that_the_expression_on_the_right_(getting_the_response)_should_be_done_asynchronously_but_the_flow_should_only_continue_when_the_result_is_available._In_other_words,_from_the_point_of_view_of_the_code_block,_it's_as_if_getting_the_response_is_a_blocking_call,_whereas_from_the_point_of_view_of_the_system,_the_thread_won't_be_blocked_and_may_be_used_to_process_other_flows_while_the_result_needed_for_this_one_doesn't_become_available.
The_async_block_may_be_invoked_using_the_Async.RunSynchronously
_function._Multiple_async_blocks_can_be_executed_in_parallel_using_the_Async.Parallel
_function_that_takes_a_list_of_async
_objects_(in_the_example,_asynctask
_is_an_async_object)_and_creates_another_async_object_to_run_the_tasks_in_the_lists_in_parallel._The_resultant_object_is_invoked_using_Async.RunSynchronously
.
_Inversion_of_control_in_F#_follows_this_pattern.
_Parallel_programming
Parallel_programming_is_supported_partly_through_the_Async.Parallel
,_Async.Start
_and_other_operations_that_run_asynchronous_blocks_in_parallel.
Parallel_programming_is_also_supported_through_the_Array.Parallel
_functional_programming_operators_in_the_F#_standard_library,_direct_use_of_the_System.Threading.Tasks
_task_programming_model,_the_direct_use_of_.NET_thread_pool_and_.NET_threads_and_through_dynamic_translation_of_F#_code_to_alternative_parallel_execution_engines_such_as__GPU _code.
_Units_of_measure
The_F#_type_system_supports__units_of_measure_checking_for_numbers._The_units_of_measure_feature_integrates_with_F#_type_inference_to_require_minimal_type_annotations_in_user_code.
_Metaprogramming
F#_allows_some_forms_of_syntax_customizing_via__metaprogramming_to_support_embedding_custom__domain-specific_languages_within_the_F#_language,_particularly_through_computation_expressions.
F#_includes_a_feature_for_run-time_meta-programming_called_quotations._A_quotation_expression_evaluates_to_an_abstract_syntax_tree_representation_of_the_F#_expressions._Similarly,_definitions_labelled_with_the__lt;ReflectedDefinition>/code>_attribute_can_also_be_accessed_in_their_quotation_form._F#_quotations_are_used_for_various_purposes_including_to_compile_F#_code_into_JavaScript_
JavaScript_(),_often_abbreviated_as_JS,_is_a__programming_language_that_is_one_of_the_core_technologies_of_the__World_Wide_Web,_alongside_HTML_and_CSS._As_of_2022,_98%_of__websites_use_JavaScript_on_the__client_side_for__webpage_behavior,_of_...
_and__GPU _code._(Quotations_represent_their_F#_code_expressions_as_data_for_use_by_other_parts_of_the_program_while_requiring_it_to_be_syntactically_correct_F#_code).
_Information-rich_programming
F#_3.0_introduced_a_form_of_compile-time_meta-programming_through_statically_extensible_type_generation_called_F#_type_providers._F#_type_providers_allow_the_F#_compiler_and_tools_to_be_extended_with_components_that_provide_type_information_to_the_compiler_on-demand_at_compile_time._F#_type_providers_have_been_used_to_give_strongly_typed_access_to_connected_information_sources_in_a_scalable_way,_including_to_the__Freebase_knowledge_graph.
In_F#_3.0_the_F#_quotation_and_computation_expression_features_are_combined_to_implement__LINQ_queries.__For_example:
//_Use_the_OData_type_provider_to_create_types_that_can_be_used_to_access_the_Northwind_database.
open_Microsoft.FSharp.Data.TypeProviders
type_Northwind_=_ODataService<"http://services.odata.org/Northwind/Northwind.svc">
let_db_=_Northwind.GetDataContext()
//_A_query_expression.
let_query1_=_query_
The_combination_of_type_providers,_queries_and_strongly_typed_functional_programming_is_known_as_''information_rich_programming''.
_Agent_programming
F#_supports_a_variation_of_the_Actor_
An_actor_or_actress_is_a_person_who_portrays_a_character_in_a_performance._The_actor_performs_"in_the_flesh"_in_the_traditional_medium_of_the_theatre_or_in_modern_media_such_as__film,_radio,_and_television._The_analogous_Greek_term_is__(),_lit_...
_programming_model_through_the_in-memory_implementation_of_lightweight_asynchronous_agents._For_example,_the_following_code_defines_an_agent_and_posts_2_messages:
let_counter_=
____MailboxProcessor.Start(fun_inbox_->
________let_rec_loop_n_=
____________async_
________loop_0)
_Development_tools
*_Visual_Studio_
Visual_Studio_is_an_integrated_development_environment_(IDE)_from_Microsoft._It_is_used_to_develop_computer_programs_including_web_site,_websites,_web_apps,_web_services_and_mobile_apps._Visual_Studio_uses_Microsoft_software_development_platfor_...
,_with_the_Visual_F#_tools_from_Microsoft_
Microsoft_Corporation_is_an_American__multinational__technology_corporation_producing__computer_software,__consumer_electronics,_personal_computers,_and_related_services_headquartered_at_the_Microsoft_Redmond_campus_located_in__Redmond,_Washi_...
_installed,_can_be_used_to_create,_run_and_debug_F#_projects._The_Visual_F#_tools_include_a_Visual_Studio-hosted__read–eval–print_loop_(REPL)_interactive_console_that_can_execute_F#_code_as_it_is_written.__Visual_Studio_for_Mac_also_fully_supports_F#_projects.
*__Visual_Studio_Code_contains_full_support_for_F#_via_th
Ionide_extension
*_F#_can_be_developed_with_any_text_editor._Specific_support_exists_in_editors_such_as_Emacs_
Emacs_,_originally_named_EMACS_(an_acronym_for_"Editor_MACroS"),_is_a_family_of__text_editors_that_are_characterized_by_their__extensibility._The_manual_for_the_most_widely_used_variant,_GNU_Emacs,_describes_it_as_"the_extensible,_customizable,__...
.
*__JetBrains_Rider_is_optimized_for_the_development_of_F#_Code_starting_with_release_2019.1.
*__LINQPad_has_supported_F#_since_version_2.x.
_Application_areas
F#_is_a__general-purpose_programming_language.
_Web_programming
Th
SAFE_Stack
is_an_end-to-end_F#_stack_to_develop_web_applications._It_uses_ASP.NET_Core_
ASP.NET_Core_is_a_free_and_open-source_web_framework_and_successor_to__ASP.NET,_developed_by_Microsoft._It_is_a_modular_framework_that_runs_on_both_the_full_.NET_Framework,_on_Windows,_and_the_cross-platform__.NET._However,_ASP.NET_Core_version_3__...
_on_the_server_side_an
Fable
on_the_client_side.
An_alternative_end-to-end_F#_option_is_the__WebSharper_framework.
_Cross-platform_app_development
F#_can_be_used_together_with_th
Visual_Studio_Tools_for_Xamarin
to_develop_apps_for__iOS_and__Android._Th
Fabulous
library_provides_a_more_comfortable_functional_interface.
__Analytical_programming_
Among_others,_F#_is_used_for_quantitative_finance_programming,_energy_trading_and_portfolio_optimization,_machine_learning,_business_intelligence_and_social_gaming_on_Facebook_
Facebook_is_an_online__social_media_and__social_networking_service_owned_by_American_company__Meta_Platforms._Founded_in_2004_by__Mark_Zuckerberg_with_fellow__Harvard_College_students_and_roommates__Eduardo_Saverin,_Andrew_McCollum,__Dust_...
.
In_the_2010s,_F#_has_been_positioned_as_an_optimized_alternative_to__C#._F#'s_scripting_ability_and_inter-language_compatibility_with_all_Microsoft_products_have_made_it_popular_among_developers.
_Scripting
F#_can_be_used_as_a_scripting_language,_mainly_for_desktop__read–eval–print_loop_(REPL)_scripting.
_Open-source_community
The_F#__open-source_community_includes_the_F#_Software_Foundation _and_the_F#_Open_Source_Group_at_GitHub_
GitHub,_Inc._()_is_an__Internet_hosting_service_for__software_development_and__version_control_using__Git._It_provides_the__distributed_version_control_of_Git_plus__access_control,_bug_tracking,__software_feature_requests,_task_management,__cont_...
. _Popular_open-source_F#_projects_include:
Fable
_an_F#_to_Javascript_transpiler_based_o
Babel
Paket
_an_alternative_package_manager_for_.NET_that_can_still_use_NuGet_
NuGet_(pronounced_"New_Get")And_The_Winner_Is,_NuGet
_haacke_...
_repositories,_but_has_centralised_version-management.
FAKE
_an_F#_friendly_build-system.
Giraffe
_a_functionally_oriented_middleware_for_ASP.NET_Core_
ASP.NET_Core_is_a_free_and_open-source_web_framework_and_successor_to__ASP.NET,_developed_by_Microsoft._It_is_a_modular_framework_that_runs_on_both_the_full_.NET_Framework,_on_Windows,_and_the_cross-platform__.NET._However,_ASP.NET_Core_version_3__...
.
Suave
_a_lightweight_web-server_and_web-development_library.
_Compatibility
F#_features_a_legacy_"ML_compatibility_mode"_that_can_directly_compile_programs_written_in_a_large_subset_of_OCaml_roughly,_with_no_functors,_objects,_polymorphic_variants,_or_other_additions.
_Examples
A_few_small_samples_follow:
//_This_is_a_comment_for_a_sample_hello_world_program.
printfn_"Hello_World!"
A_Person_class_with_a_constructor_taking_a_name_and_age_and_two_immutable_properties.
///_This_is_a_documentation_comment_for_a_type_definition.
type_Person(name_:_string,_age_:_int)_=
____member_x.Name_=_name
____member_x.Age_=_age
____
///_class_instantiation
let_mrSmith_=_Person("Smith",_42)
A_simple_example_that_is_often_used_to_demonstrate_the_syntax_of_functional_languages_is_the__factorial_function_for_non-negative_32-bit_integers,_here_shown_in_F#:
///_Using_pattern_matching_expression
let_rec_factorial_n_=
____match_n_with
____, _0_->_1
____, ___->_n_*_factorial_(n_-_1)
///_For_a_single-argument_functions_there_is_syntactic_sugar_(pattern_matching_function):
let_rec_factorial_=_function_
____, _0_->_1_
____, _n_->_n_*_factorial_(n_-_1)
____
///_Using_fold_and_range_operator
let_factorial_n_=__..n, >_Seq.fold_(*)_1
Iteration_examples:
///_Iteration_using_a_'for'_loop
let_printList_lst_=_
____for_x_in_lst_do
________printfn_"%d"_x
///_Iteration_using_a_higher-order_function
let_printList2_lst_=_
____List.iter_(printfn_"%d")_lst
///_Iteration_using_a_recursive_function_and_pattern_matching
let_rec_printList3_lst_=
____match_lst_with
____, _[]_->_()
____, _h_::_t_->
________printfn_"%d"_h
________printList3_t
Fibonacci_examples:
///_Fibonacci_Number_formula
let_fib_n_=
____let_rec_g_n_f0_f1_=
________match_n_with
________, _0_->_f0
________, _1_->_f1
________, ___->_g_(n_-_1)_f1_(f0_+_f1)
____g_n_0_1
///_Another_approach_-_a_lazy_infinite_sequence_of_Fibonacci_numbers
let_fibSeq_=_Seq.unfold_(fun_(a,b)_->_Some(a+b,_(b,_a+b)))_(0,1)
//_Print_even_fibs
__.._10, >_List.map_____fib
, >_List.filter__(fun_n_->_(n_%_2)_=_0)
, >_printList
//_Same_thing,_using_a_list_expression
_for_i_in_1..10_do
____let_r_=_fib_i
____if_r_%_2_=_0_then_yield_r_, >_printList
A_sample_Windows_Forms_program:
//_Open_the_Windows_Forms_library
open_System.Windows.Forms
//_Create_a_window_and_set_a_few_properties
let_form_=_new_Form(Visible=true,_TopMost=true,_Text="Welcome_to_F#")
//_Create_a_label_to_show_some_text_in_the_form
let_label_=
____let_x_=_3_+_(4_*_5)
____new_Label(Text_=_$"")
//_Add_the_label_to_the_form
form.Controls.Add(label)
//_Finally,_run_the_form
_.html"_;"title="System.STAThread>">System.STAThread>Application.Run(form)
Asynchronous_parallel_programming_sample_(parallel_CPU_and_I/O_tasks):
///_A_simple_prime_number_detector
let_isPrime_(n:int)_=
___let_bound_=_int_(sqrt_(float_n))
___seq__, >_Seq.forall_(fun_x_->_n_%_x_<>_0)
//_We_are_using_async_workflows
let_primeAsync_n_=
____async_
///_Return_primes_between_m_and_n_using_multiple_threads
let_primes_m_n_=
____seq_
________, >_Seq.map_primeAsync
________, >_Async.Parallel
________, >_Async.RunSynchronously
________, >_Array.filter_snd
________, >_Array.map_fst
//_Run_a_test
primes_1000000_1002000
____, >_Array.iter_(printfn_"%d")
_See_also
*__OCaml
*__C#
*_.NET_Framework_
The_.NET_Framework_(pronounced_as_"''dot_net"'')_is_a_proprietary__software_framework_developed_by_Microsoft_that_runs_primarily_on_Microsoft_Windows._It_was_the_predominant_implementation_of_the__Common_Language_Infrastructure_(CLI)_until_bein_...
_Notes
_References
*_
*_
*_
*_
*_
*_
*_
*_
_External_links
*__The_F#_Software_Foundation
The_F#_Open_Source_Group_at_GitHub
The_Visual_F#_Developer_Center
Tsunami,_an_embeddable_desktop_F#_IDE
Try_F#,_for_learning_F#_in_a_web_browser
F#_Snippets_Site
The_Visual_F#_team_blog
The_original_Microsoft_Research_website_for_F#
Planet_F#
The_F#_Survival_Guide,_Dec_2009_(Web-based_book)
The_F#_Language_Specification
An_introduction_to_F#_programming
{{Microsoft_Research
_.NET_programming_languages
_Cross-platform_free_software
_Functional_languages
_Microsoft_free_software
_Microsoft_programming_languages
_Microsoft_Research
_ML_programming_language_family
_OCaml_programming_language_family
_Pattern_matching_programming_languages
_Programming_languages_created_in_2005
_Programming_languages_supporting_units_of_measure
_Software_using_the_Apache_license
_Software_using_the_MIT_license
Statically_typed_programming_languages>_..._, /code>_through_code_that_generates_values._For_example,
_seq_
forms_a_sequence_of_squares_of_numbers_from_0_to_14_by_filtering_out_numbers_from_the_range_of_numbers_from_0_to_25._Sequences_are__Generator_(computer_programming), generators_–_values_are_generated_on-demand_(i.e.,_are__lazily_evaluated)_–_while_lists_and_arrays_are_evaluated_eagerly.
F#_uses__pattern_matching_to_bind_values_to_names._Pattern_matching_is_also_used_when_accessing_discriminated_unions_–_the_union_is_value_matched_against_pattern_rules_and_a_rule_is_selected_when_a_match_succeeds._F#_also_supports_''Active_Patterns''_as_a_form_of_extensible_pattern_matching. _It_is_used,_for_example,_when_multiple_ways_of_matching_on_a_type_exist.
F#_supports_a_general_syntax_for_defining_compositional_computations_called_'._Sequence_expressions,_asynchronous_computations_and_queries_are_particular_kinds_of_computation_expressions._Computation_expressions_are_an_implementation_of_the__monad_pattern.
_Imperative_programming
F#_support_for_imperative_programming_includes
*_for
__loops
*_while
__loops
*__arrays,_created_with_the___through_code_that_generates_values._For_example,
_seq_
forms_a_sequence_of_squares_of_numbers_from_0_to_14_by_filtering_out_numbers_from_the_range_of_numbers_from_0_to_25._Sequences_are__Generator_(computer_programming), generators_–_values_are_generated_on-demand_(i.e.,_are__lazily_evaluated)_–_while_lists_and_arrays_are_evaluated_eagerly.
F#_uses__pattern_matching_to_bind_values_to_names._Pattern_matching_is_also_used_when_accessing_discriminated_unions_–_the_union_is_value_matched_against_pattern_rules_and_a_rule_is_selected_when_a_match_succeeds._F#_also_supports_''Active_Patterns''_as_a_form_of_extensible_pattern_matching. _It_is_used,_for_example,_when_multiple_ways_of_matching_on_a_type_exist.
F#_supports_a_general_syntax_for_defining_compositional_computations_called_'._Sequence_expressions,_asynchronous_computations_and_queries_are_particular_kinds_of_computation_expressions._Computation_expressions_are_an_implementation_of_the__monad_pattern.
_Imperative_programming
F#_support_for_imperative_programming_includes
*_for
__loops
*_while
__loops
*__arrays,_created_with_the_[, _..._, ]
_syntax
*__Associative_array, hash_table,_created_with_the_dict__..._/code>_syntax_or_System.Collections.Generic.Dictionary<_,_>
_type.
Values_and_record_fields_can_also_be_labelled_as_mutable
._For_example:
//_Define_'x'_with_initial_value_'1'
let_mutable_x_=_1
//_Change_the_value_of_'x'_to_'3'
x_<-_3
Also,_F#_supports_access_to_all_CLI_types_and_objects_such_as_those_defined_in_the_System.Collections.Generic
_namespace_defining_imperative_data_structures.
_Object-oriented_programming
Like_other__Common_Language_Infrastructure_(CLI)_languages,_F#_can_use_CLI_types_through_object-oriented_programming. __F#_support_for_object-oriented_programming_in_expressions_includes:
*_Dot-notation,_e.g.,_
*_Object_expressions,_e.g.,_
*_Object_construction,_e.g.,_
*_Type_tests,_e.g.,_
*_Type_coercions,_e.g.,_
*_Named_arguments,_e.g.,_
*_Named_setters,_e.g.,_
*_Optional_arguments,_e.g.,_
Support_for_object-oriented_programming_in_patterns_includes
*_Type_tests,_e.g.,_
*_Active_patterns,_which_can_be_defined_over_object_types
F#_object_type_definitions_can_be_class,_struct,_interface,_enum,_or_delegate_type_definitions,_corresponding_to_the_definition_forms_found_in__C#._For_example,_here_is_a_class_with_a_constructor_taking_a_name_and_age,_and_declaring_two_properties.
///_A_simple_object_type_definition
type_Person(name_:_string,_age_:_int)_=
____member_x.Name_=_name
____member_x.Age_=_age
_Asynchronous_programming
F#_supports__asynchronous_programming_through_''asynchronous_workflows''. _An_asynchronous_workflow_is_defined_as_a_sequence_of_commands_inside_an_async
,_as_in
let_asynctask_=_
____async_
The_let!
_indicates_that_the_expression_on_the_right_(getting_the_response)_should_be_done_asynchronously_but_the_flow_should_only_continue_when_the_result_is_available._In_other_words,_from_the_point_of_view_of_the_code_block,_it's_as_if_getting_the_response_is_a_blocking_call,_whereas_from_the_point_of_view_of_the_system,_the_thread_won't_be_blocked_and_may_be_used_to_process_other_flows_while_the_result_needed_for_this_one_doesn't_become_available.
The_async_block_may_be_invoked_using_the_Async.RunSynchronously
_function._Multiple_async_blocks_can_be_executed_in_parallel_using_the_Async.Parallel
_function_that_takes_a_list_of_async
_objects_(in_the_example,_asynctask
_is_an_async_object)_and_creates_another_async_object_to_run_the_tasks_in_the_lists_in_parallel._The_resultant_object_is_invoked_using_Async.RunSynchronously
.
_Inversion_of_control_in_F#_follows_this_pattern.
_Parallel_programming
Parallel_programming_is_supported_partly_through_the_Async.Parallel
,_Async.Start
_and_other_operations_that_run_asynchronous_blocks_in_parallel.
Parallel_programming_is_also_supported_through_the_Array.Parallel
_functional_programming_operators_in_the_F#_standard_library,_direct_use_of_the_System.Threading.Tasks
_task_programming_model,_the_direct_use_of_.NET_thread_pool_and_.NET_threads_and_through_dynamic_translation_of_F#_code_to_alternative_parallel_execution_engines_such_as__GPU _code.
_Units_of_measure
The_F#_type_system_supports__units_of_measure_checking_for_numbers._The_units_of_measure_feature_integrates_with_F#_type_inference_to_require_minimal_type_annotations_in_user_code.
_Metaprogramming
F#_allows_some_forms_of_syntax_customizing_via__metaprogramming_to_support_embedding_custom__domain-specific_languages_within_the_F#_language,_particularly_through_computation_expressions.
F#_includes_a_feature_for_run-time_meta-programming_called_quotations._A_quotation_expression_evaluates_to_an_abstract_syntax_tree_representation_of_the_F#_expressions._Similarly,_definitions_labelled_with_the__lt;ReflectedDefinition>/code>_attribute_can_also_be_accessed_in_their_quotation_form._F#_quotations_are_used_for_various_purposes_including_to_compile_F#_code_into_JavaScript_
JavaScript_(),_often_abbreviated_as_JS,_is_a__programming_language_that_is_one_of_the_core_technologies_of_the__World_Wide_Web,_alongside_HTML_and_CSS._As_of_2022,_98%_of__websites_use_JavaScript_on_the__client_side_for__webpage_behavior,_of_...
_and__GPU _code._(Quotations_represent_their_F#_code_expressions_as_data_for_use_by_other_parts_of_the_program_while_requiring_it_to_be_syntactically_correct_F#_code).
_Information-rich_programming
F#_3.0_introduced_a_form_of_compile-time_meta-programming_through_statically_extensible_type_generation_called_F#_type_providers._F#_type_providers_allow_the_F#_compiler_and_tools_to_be_extended_with_components_that_provide_type_information_to_the_compiler_on-demand_at_compile_time._F#_type_providers_have_been_used_to_give_strongly_typed_access_to_connected_information_sources_in_a_scalable_way,_including_to_the__Freebase_knowledge_graph.
In_F#_3.0_the_F#_quotation_and_computation_expression_features_are_combined_to_implement__LINQ_queries.__For_example:
//_Use_the_OData_type_provider_to_create_types_that_can_be_used_to_access_the_Northwind_database.
open_Microsoft.FSharp.Data.TypeProviders
type_Northwind_=_ODataService<"http://services.odata.org/Northwind/Northwind.svc">
let_db_=_Northwind.GetDataContext()
//_A_query_expression.
let_query1_=_query_
The_combination_of_type_providers,_queries_and_strongly_typed_functional_programming_is_known_as_''information_rich_programming''.
_Agent_programming
F#_supports_a_variation_of_the_Actor_
An_actor_or_actress_is_a_person_who_portrays_a_character_in_a_performance._The_actor_performs_"in_the_flesh"_in_the_traditional_medium_of_the_theatre_or_in_modern_media_such_as__film,_radio,_and_television._The_analogous_Greek_term_is__(),_lit_...
_programming_model_through_the_in-memory_implementation_of_lightweight_asynchronous_agents._For_example,_the_following_code_defines_an_agent_and_posts_2_messages:
let_counter_=
____MailboxProcessor.Start(fun_inbox_->
________let_rec_loop_n_=
____________async_
________loop_0)
_Development_tools
*_Visual_Studio_
Visual_Studio_is_an_integrated_development_environment_(IDE)_from_Microsoft._It_is_used_to_develop_computer_programs_including_web_site,_websites,_web_apps,_web_services_and_mobile_apps._Visual_Studio_uses_Microsoft_software_development_platfor_...
,_with_the_Visual_F#_tools_from_Microsoft_
Microsoft_Corporation_is_an_American__multinational__technology_corporation_producing__computer_software,__consumer_electronics,_personal_computers,_and_related_services_headquartered_at_the_Microsoft_Redmond_campus_located_in__Redmond,_Washi_...
_installed,_can_be_used_to_create,_run_and_debug_F#_projects._The_Visual_F#_tools_include_a_Visual_Studio-hosted__read–eval–print_loop_(REPL)_interactive_console_that_can_execute_F#_code_as_it_is_written.__Visual_Studio_for_Mac_also_fully_supports_F#_projects.
*__Visual_Studio_Code_contains_full_support_for_F#_via_th
Ionide_extension
*_F#_can_be_developed_with_any_text_editor._Specific_support_exists_in_editors_such_as_Emacs_
Emacs_,_originally_named_EMACS_(an_acronym_for_"Editor_MACroS"),_is_a_family_of__text_editors_that_are_characterized_by_their__extensibility._The_manual_for_the_most_widely_used_variant,_GNU_Emacs,_describes_it_as_"the_extensible,_customizable,__...
.
*__JetBrains_Rider_is_optimized_for_the_development_of_F#_Code_starting_with_release_2019.1.
*__LINQPad_has_supported_F#_since_version_2.x.
_Application_areas
F#_is_a__general-purpose_programming_language.
_Web_programming
Th
SAFE_Stack
is_an_end-to-end_F#_stack_to_develop_web_applications._It_uses_ASP.NET_Core_
ASP.NET_Core_is_a_free_and_open-source_web_framework_and_successor_to__ASP.NET,_developed_by_Microsoft._It_is_a_modular_framework_that_runs_on_both_the_full_.NET_Framework,_on_Windows,_and_the_cross-platform__.NET._However,_ASP.NET_Core_version_3__...
_on_the_server_side_an
Fable
on_the_client_side.
An_alternative_end-to-end_F#_option_is_the__WebSharper_framework.
_Cross-platform_app_development
F#_can_be_used_together_with_th
Visual_Studio_Tools_for_Xamarin
to_develop_apps_for__iOS_and__Android._Th