Functional languages are based on mathematical functions and immutable data, with an emphasis on pure and declarative code and the avoidance of side effects and state changes. Examples of these languages include Haskell, Lisp, and Scala. Applying SOLID principles to functional languages can be done through strategies such as single responsibility (by defining small and pure functions that perform one task and composing them to create larger functions while avoiding mixing logic and IO operations in the same function), open-closed (by using higher-order functions and polymorphism to create functions that can accept and return other functions as arguments or results, extending the functionality of existing functions without modifying them), Liskov substitution (by using type classes and algebraic data types to define abstract types and subtypes that can be substituted for each other without breaking the program logic, while ensuring that the subtypes respect the contracts and invariants of the supertypes), interface segregation (by using modules and namespaces to group related functions and types and exposing only the necessary ones to the clients, avoiding large, complex interfaces that force clients to depend on unnecessary or irrelevant functions or types), and dependency inversion (by using dependency injection and inversion of control to decouple high-level and low-level components of the software, passing low-level components as arguments or parameters to high-level components rather than creating or importing them inside high-level components).