Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Elixir’s = is a match operator, not merely an assignment operator: it binds variables that are not yet constrained, while checking that the value on the right satisfies the shape and literal values on the left. If the pattern does not fit, Elixir raises a MatchError. To fix one, inspect the actual value first, then decide whether you meant to assert one shape or handle several possible inputs.

The examples here follow the current Elixir v1.20.4 Patterns and guards reference. Error wording and diagnostic details can vary by Elixir version.

Why does Elixir raise a MatchError?

A match succeeds only if the value on the right fits every requirement in the pattern on the left. Variables can be bound to parts of the value, but literal values and structural requirements must already match.

x = 1
2 = x

The first line binds x to 1. The second requires the value of x to be 2, so it raises a MatchError. The familiar message “no match of right hand side value” points you toward the value that failed to fit.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
Elebase USB to USB C Adapter for iPhone 18 Pro Max,USBC Car Charger Adapter
  • Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
  • Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
  • Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
  • Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
  • 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.

For example, if a function returns {:error, :not_found}, then this assertion fails:

{:ok, result} = fetch_record(id)

It works only when the call returns a tuple whose first element is :ok and whose second element can bind to result. If both success and error results are valid outcomes, branch on them instead of asserting success:

case fetch_record(id) do
  {:ok, result} -> use_record(result)
  {:error, reason} -> handle_error(reason)
end

Use = when a mismatch should fail at that point because the assumed shape is required. Use case or function clauses when multiple shapes are part of the supported input contract.

Rank #2
Anker USB-C Hub, 5-in-1 USB Hub for Laptops, 4K HDMI Multiport Adapter
  • 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
  • 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
  • Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
  • 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
  • What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.

Did a variable bind a new value instead of checking its old value?

In a pattern, an ordinary variable is a place to bind a value. It does not automatically compare the incoming value with what the variable held before. Pin a variable with ^ when the pattern must match its existing value:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
expected = :ready
^expected = :ready   # matches
^expected = :busy    # raises MatchError

Without the pin, expected = :busy would bind or rebind the variable to :busy. Within a single pattern, if a variable appears more than once, each occurrence must match the same value.

How do tuple, list, and map patterns differ?

Pattern What it requires Example failure or behavior
Tuple The tuple’s shape and arity must fit the pattern. {a, b} does not match {1, 2, 3}.
List The list structure must fit; [] matches only an empty list. [head | tail] matches a non-empty list and binds its first item and remaining list.
Map Every key listed in the pattern must exist and its value must match; extra keys are allowed. %{name: name} can match a map with additional keys, while %{name: name, age: age} fails if :age is absent.

An empty map pattern, %{}, matches maps generally; it does not assert that the map has no entries. Map pattern keys must be literals or previously bound variables pinned with ^. These distinctions are useful when narrowing down a mismatch: check tuple arity, list shape, or the presence of every required map key. See the current Patterns and guards reference for the supported forms.

Rank #3
Sale
Anker USB C Hub, 7in1 Multi-Port USB Adapter, 4K@60Hz USBC to HDMI Splitter
  • Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
  • Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
  • Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
  • Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
  • What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.

What do FunctionClauseError and CaseClauseError mean?

A FunctionClauseError means a function was called, but none of its clauses matched the arguments and applicable guards. A CaseClauseError means the value of a case expression matched none of its branches. In either case, compare the actual input with each pattern and guard, then add only the alternatives your code intends to support.

For instance, a function defined only for non-empty lists has no matching clause for an empty list:

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
def first([head | _tail]), do: head

first([])

If an empty list is valid, add an explicit clause. If it is invalid, reject it at a clear boundary with a deliberate error message rather than letting an unexplained clause failure become the contract.

Rank #4
Sale
UGREEN USB to USB C Adapter Combo 4-Pack, 10Gbps USB C Converter Space Gray
  • Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
  • Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
  • Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
  • Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
  • Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft

A case has the same need for coverage when its input may take multiple valid forms:

case status do
  :ready -> start_work()
  :stopped -> :ok
  other -> {:error, {:unsupported_status, other}}
end

Educational examples of FunctionClauseError appear in Elixir School’s Functions lesson; the official getting-started material demonstrates CaseClauseError when no branch matches in its case, cond, and if chapter.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Why can’t I call a function in a pattern?

Patterns have their own restricted syntax. A function call such as length(list) is an expression, not a legal left-hand pattern. Match the list’s shape first, then use a guard or ordinary code for an additional condition:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Best Value
Anker USB C Hub, 5-in-1 USBC to HDMI Splitter with 4K Display
  • 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
  • Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
  • Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
  • HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
  • What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.
case items do
  [_first, _second | _rest] -> :at_least_two
  _ -> :fewer_than_two
end

Similarly, the right side of = is evaluated as a normal expression; a fresh variable written there is not automatically treated as a pattern variable. If a previously bound value must constrain a later match, pin it on the pattern side.

When should I use a guard?

A when guard refines a structural pattern with supported predicates. Guards permit only a restricted set of expressions, so move unsupported calculations into ordinary code. An error while evaluating a guard does not escape as a separate exception: that guard simply fails, allowing another clause to match or causing the overall selection to fail.

def classify(value) when is_integer(value) and value > 0, do: :positive

def classify(_value), do: :not_positive_integer

Check both the structural pattern and its guard when diagnosing a clause error; matching the shape alone may not be enough. The Elixir v1.20.4 reference describes guard restrictions and failure behavior.

How to debug a failed pattern match

  1. Read the full exception. Identify the expression or function call where matching failed and whether the error is a MatchError, FunctionClauseError, or CaseClauseError.
  2. Inspect the exact value at that point. Check whether it is a tuple, list, map, or struct; for tuples, check arity; for maps, check keys and values. Avoid reasoning only from what the value was expected to be.
  3. Check variable intent. Decide whether each variable should bind a new value or constrain the match to an existing one. Use ^variable for the latter.
  4. Review every clause and guard. Compare the real input with each function, case, or anonymous-function clause, including guard conditions.
  5. Choose assertion or branching deliberately. Keep a direct match for a required invariant; use explicit branches and error handling when legitimate inputs can have different shapes.

For normative matching rules and examples, consult the Elixir v1.20.4 Patterns and guards reference. The introductory Elixir pattern matching tutorial also illustrates basic matching; the versioned reference is the better guide to current details.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.