Liquid Haskell is an extension to the type system of Haskell that supports formal reasoning about program correctness by encoding logical properties as refinement types. In this article, we show how Liquid Haskell can also be used to reason about program efficiency in the same setting. We use the system's existing verification machinery to ensure that the results of our cost analysis are valid, together with custom invariants for particular program contexts to ensure that the results of our analysis are precise. To illustrate our approach, we analyse the efficiency of a wide range of popular data structures and algorithms, and in doing so, explore various notions of resource usage. Our experience is that reasoning about efficiency in Liquid Haskell is often just as simple as reasoning about correctness, and that the two can naturally be combined.In this article, we take inspiration from [Radiček et al. 2018] and implement a monadic datatype to measure the abstract resource usage of pure Haskell programs. We then use Liquid Haskell's [Vazou 2016] refinement type system to statically prove bounds on resource usage. Our framework supports the standard approach to cost analysis, which is known as unary cost analysis and aims to establish upper and lower bounds on the execution cost of a single program, together with the more recent relational approach [Çiçek 2018], which aims to calculate the difference between the execution costs of two related programs or between one program on two different inputs.Reasoning about execution cost using the Liquid Haskell system has two main advantages over most other formal cost analysis frameworks [Radiček et al. 2018]. First of all, the system allows correctness properties to be naturally integrated into cost analysis, which helps to ensure that cost analyses are valid. And secondly, the wide range of sophisticated invariants that can be expressed and automatically verified by the system can be exploited to analyse resource usage in particular program contexts, which often leads to more precise and/or simpler analyses.By way of example, Liquid Haskell can automatically verify that Haskell's standard sort function returns an ordered list (of type OList a) with the same length as its input, even when the result is embedded in the Tick datatype that we use to measure resource usage: sort :: Ord a => xs:[a] → Tick { zs:OList a | length zs == length xs } Applying our cost analysis to this function then allows us to prove that the maximum number of comparisons required to sort any list xs is O(n log n), where n = lenдth xs: sortCost :: Ord a => xs:[a] → { tcost (sort xs) <= 4 * length xs * log 2 (length xs) + length xs } Moreover, we can also combine correctness and resource properties to show that the maximum number of comparisons becomes linear when the input list is already sorted: sortCostSorted :: Ord a => xs:OList a → { tcost (sort xs) <= length xs }The aim of this article is to develop, prove correct, and evaluate a system that supports the above form of reasoning. To this end, t...