History
Versions
Language evolution
F# uses an open development and engineering process. The language evolution process is managed by Don Syme from Microsoft Research as the benevolent dictator for life (BDFL) for the language design, together with the F# Software Foundation. Earlier versions of the F# language were designed byLanguage overview
Functional programming
While supporting object-oriented features available in C#, F# is a strongly typed functional-first language with a large number of capabilities that are normally found only inif
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 ::
is the []
. 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
In computer science, pattern matching is the act of checking a given sequence of tokens for the presence of the constituents of some pattern. In contrast to pattern recognition, the match usually has to be exact: "either it will or will not be ...
_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
Monad may refer to:
Philosophy
* Monad (philosophy), a term meaning "unit"
**Monism, the concept of "one essence" in the metaphysical and theological theory
** Monad (Gnosticism), the most primal aspect of God in Gnosticism
* ''Great Monad'', a ...
_pattern.
_Imperative_programming
F#_support_for_imperative_programming_includes
*_for
_ loops
*_while
_ loops
*_arrays
An array is a systematic arrangement of similar objects, usually in rows and columns.
Things called an array include:
{{TOC right
Music
* In twelve-tone and serial composition, the presentation of simultaneous twelve-tone sets such that the ...
,_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
Asynchrony, in computer programming, refers to the occurrence of events independent of the main control flow, program flow and ways to deal with such events. These may be "outside" events such as the arrival of Unix signal, signals, or actions ins ...
_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 software engineering, inversion of control (IoC) is a design pattern in which custom-written portions of a computer program receive the flow of control from a generic framework. A software architecture with this design inverts control as co ...
_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
A graphics processing unit (GPU) is a specialized electronic circuit designed to manipulate and alter memory to accelerate the creation of images in a frame buffer intended for output to a display device. GPUs are used in embedded systems, mobi ...
_code.
_Units_of_measure
The_F#_type_system_supports_units_of_measure
A unit of measurement is a definite magnitude of a quantity, defined and adopted by convention or by law, that is used as a standard for measurement of the same kind of quantity. Any other quantity of that kind can be expressed as a multi ...
_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
Metaprogramming is a programming technique in which computer programs have the ability to treat other programs as their data. It means that a program can be designed to read, generate, analyze or transform other programs, and even modify itself ...
_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__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__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
*_ 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_
Asynchrony,_in_computer_programming,_refers_to_the_occurrence_of_events_independent_of_the_main_control_flow,_program_flow_and_ways_to_deal_with_such_events._These_may_be_"outside"_events_such_as_the_arrival_of_Unix_signal,_signals,_or_actions_ins_...
_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_software_engineering,_inversion_of_control_(IoC)_is_a__design_pattern_in_which_custom-written_portions_of_a_computer_program_receive_the__flow_of_control_from_a_generic_framework._A__software_architecture_with_this_design_inverts_control_as_co_...
_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_
A_graphics_processing_unit_(GPU)_is_a_specialized_electronic_circuit_designed_to_manipulate_and_alter_memory_to_accelerate_the_creation_of__images_in_a_frame_buffer_intended_for_output_to_a_display_device._GPUs_are_used_in_embedded_systems,_mobi_...
_code.
_Units_of_measure
The_F#_type_system_supports_units_of_measure_
A_unit_of_measurement_is_a_definite__magnitude_of_a_quantity,_defined_and_adopted_by_convention_or_by_law,_that_is_used_as_a_standard_for_measurement_of_the_same_kind_of_quantity._Any_other_quantity_of_that_kind_can_be_expressed_as_a_multi_...
_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_
Metaprogramming_is_a_programming_technique_in_which_computer_programs_have_the_ability_to_treat_other_programs_as_their_data._It_means_that_a_program_can_be_designed_to_read,_generate,_analyze_or_transform_other_programs,_and_even_modify_itself_...
_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_
A_graphics_processing_unit_(GPU)_is_a_specialized_electronic_circuit_designed_to_manipulate_and_alter_memory_to_accelerate_the_creation_of__images_in_a_frame_buffer_intended_for_output_to_a_display_device._GPUs_are_used_in_embedded_systems,_mobi_...
_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_
Freebase_may_refer_to:
*Free_base_or_freebase,_the_pure_basic_form_of_an_amine,_as_opposed_to_its_salt_form
*Freebase_(database),_a_former_online_database_service
*Freebase_(mixtape),_''Freebase''_(mixtape),_2014_mixtape_by_2_Chainz
*An_original__...
_knowledge_graph.
In_F#_3.0_the_F#_quotation_and_computation_expression_features_are_combined_to_implement_LINQ_
Language_Integrated_Query_(LINQ,_pronounced_"link")_is_a_Microsoft_.NET_Framework_component_that_adds_native_data__querying_capabilities_to_.NET_languages,_originally_released_as_a_major_part_of__.NET_Framework_3.5_in_2007.
LINQ_extends_the_langu_...
_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__(),_li_...
_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_websites,__web_apps,__web_services_and_mobile_apps._Visual_Studio_uses_Microsoft_software_development_platforms_such__...
,_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,_Washin_...
_installed,_can_be_used_to_create,_run_and_debug_F#_projects._The_Visual_F#_tools_include_a_Visual_Studio-hosted_read–eval–print_loop_
A_read–eval–print_loop_(REPL),_also_termed_an_interactive_toplevel_or_language_shell,_is_a_simple_interactive_computer_programming_environment_that_takes_single_user_inputs,_executes_them,_and_returns_the_result_to_the_user;_a_program_written__...
_(REPL)_interactive_console_that_can_execute_F#_code_as_it_is_written.__Visual_Studio_for_Mac_also_fully_supports_F#_projects.
*_Visual_Studio_Code_
Visual_Studio_Code,_also_commonly_referred_to_as_VS_Code,_is_a_source-code_editor_made_by_Microsoft_with_the__Electron_Framework,_for_Windows,_Linux_and_macOS._Features_include_support_for_debugging,_syntax_highlighting,__intelligent_code_comple_...
_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.
*_JetBrains_
JetBrains_s.r.o._(formerly_IntelliJ_Software_s.r.o.)_is_a_Czech__software_development_company_which_makes_tools_for__software_developers_and__project_managers._,_the_company_has_offices_in__Prague;__Munich;__Berlin;__Boston,_Massachusetts;__Ams_...
_Rider_is_optimized_for_the_development_of_F#_Code_starting_with_release_2019.1.
*_LINQPad_
LINQPad_is_a_software_utility_targeted_at_.NET_Framework_and_.NET_Core_development.__It_is_used_to_interactively_query_SQL_databases_(among_other_data_sources_such_as_OData_or_WCF_Data_Services_
_WCF_Data_Services_(formerly_ADO.NET_Data_Services_...
_has_supported_F#_since_version_2.x.
_Application_areas
F#_is_a_general-purpose_programming_language_
In_computer_software,_a_general-purpose_programming_language_(GPL)_is_a_programming_language_for_building_software_in_a_wide_variety_of_application_domains._Conversely,_a_domain-specific_programming_language_is_used_within_a_specific_area._For_exam_...
.
_Web_programming
Th
SAFE_Stack
is_an_end-to-end_F#_stack_to_develop_web_applications._It_uses__ASP.NET_Core_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_
iOS_(formerly_iPhone_OS)_is_a_mobile_operating_system_created_and_developed_by__Apple_Inc._exclusively_for__its_hardware._It_is_the_operating_system_that_powers_many_of_the_company's_mobile_devices,_including_the__iPhone;_the_term_also_include_...
_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,_Dustin_Mosk_...
.
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_
A_read–eval–print_loop_(REPL),_also_termed_an_interactive_toplevel_or_language_shell,_is_a_simple_interactive_computer_programming_environment_that_takes_single_user_inputs,_executes_them,_and_returns_the_result_to_the_user;_a_program_written__...
_(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,__continu_...
. _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.
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_
In_computer_science,_pattern_matching_is_the_act_of_checking_a_given_sequence_of__tokens_for_the_presence_of_the_constituents_of_some_pattern._In_contrast_to_pattern_recognition,_the_match_usually_has_to_be_exact:_"either_it_will_or_will_not_be__...
_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_
Monad_may_refer_to:
_Philosophy
*_Monad_(philosophy),_a_term_meaning_"unit"
**Monism,_the_concept_of_"one_essence"_in__the_metaphysical_and_theological_theory
**__Monad_(Gnosticism),_the_most_primal_aspect_of_God_in_Gnosticism
*_''Great_Monad'',_a_...
_pattern.
_Imperative_programming
F#_support_for_imperative_programming_includes
*_for
__loops
*_while
__loops
*_arrays_
An_array_is_a_systematic_arrangement_of_similar_objects,_usually_in_rows_and_columns.
Things_called_an_array_include:
{{TOC_right
__Music_
*_In__twelve-tone_and__serial_composition,_the_presentation_of_simultaneous_twelve-tone_sets_such_that_the_...
,_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_
In_computer_science,_pattern_matching_is_the_act_of_checking_a_given_sequence_of__tokens_for_the_presence_of_the_constituents_of_some_pattern._In_contrast_to_pattern_recognition,_the_match_usually_has_to_be_exact:_"either_it_will_or_will_not_be__...
_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_
Monad_may_refer_to:
_Philosophy
*_Monad_(philosophy),_a_term_meaning_"unit"
**Monism,_the_concept_of_"one_essence"_in__the_metaphysical_and_theological_theory
**__Monad_(Gnosticism),_the_most_primal_aspect_of_God_in_Gnosticism
*_''Great_Monad'',_a_...
_pattern.
_Imperative_programming
F#_support_for_imperative_programming_includes
*_for
__loops
*_while
__loops
*_arrays_
An_array_is_a_systematic_arrangement_of_similar_objects,_usually_in_rows_and_columns.
Things_called_an_array_include:
{{TOC_right
__Music_
*_In__twelve-tone_and__serial_composition,_the_presentation_of_simultaneous_twelve-tone_sets_such_that_the_...
,_created_with_the_ _..._, /code>_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_
Asynchrony,_in_computer_programming,_refers_to_the_occurrence_of_events_independent_of_the_main_control_flow,_program_flow_and_ways_to_deal_with_such_events._These_may_be_"outside"_events_such_as_the_arrival_of_Unix_signal,_signals,_or_actions_ins_...
_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_software_engineering,_inversion_of_control_(IoC)_is_a__design_pattern_in_which_custom-written_portions_of_a_computer_program_receive_the__flow_of_control_from_a_generic_framework._A__software_architecture_with_this_design_inverts_control_as_co_...
_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_
A_graphics_processing_unit_(GPU)_is_a_specialized_electronic_circuit_designed_to_manipulate_and_alter_memory_to_accelerate_the_creation_of__images_in_a_frame_buffer_intended_for_output_to_a_display_device._GPUs_are_used_in_embedded_systems,_mobi_...
_code.
_Units_of_measure
The_F#_type_system_supports_units_of_measure_
A_unit_of_measurement_is_a_definite__magnitude_of_a_quantity,_defined_and_adopted_by_convention_or_by_law,_that_is_used_as_a_standard_for_measurement_of_the_same_kind_of_quantity._Any_other_quantity_of_that_kind_can_be_expressed_as_a_multi_...
_checking_for_numbers._The_units_of_measure_feature_integrates_with_F#_type_inference_to_require_minimal_type_annotations_in_user_code.